Listado de contenido de Solidity Maps mediante bucles

Estoy desarrollando un escenario de prueba en Remix (Solidity). He visto algunos códigos de muestra, pero aún no tengo claro cómo se hace esto. He adjuntado un código de muestra (no completo) que ayudaría a aclarar esto.

Tengo dos preguntas para el siguiente escenario:

  1. Cómo creo un bucle para que el Mapa imprima la lista actual de participantes registrados. Estoy usando eventos para hacer esto. Pero necesito un bucle para repasar los participantes registrados.
  2. Cuando borro participante. ¿Cómo puedo tratar la matriz de claves registradas? participantesClave

gracias,

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;

    }

}

Respuestas (1)

Se necesita algo de pensamiento nuevo aquí. Bienvenido a Ethereum. ;-)

No puede iterar las claves en una asignación. En esencia, todas las claves existen.

Además, es un antipatrón para iterar sobre una lista ilimitada. En algún momento, se quedará sin gas debido al bloque gasLimit.

Por lo tanto, desea continuar con pequeñas funciones que cuestan aproximadamente lo mismo en gas a cualquier escala. Eso generalmente implica llevar los procesos iterativos a los clientes y construir una lógica de "una pasada" en el contrato.

Tenga cuidado de asegurarse de que el estado del contrato esté "completo" en todo momento para evitar condiciones de carrera y otras rarezas.

Eche un vistazo aquí a Mapped Struct with Index que se acerca bastante a lo que desea: ¿Existen patrones de almacenamiento simples y bien resueltos para Solidity?

Espero eso ayude.

Gracias @RobHitchens. El enlace que proporcionó me lleva a una página de Google Hangout y se redirige a la sesión de Andrew's Hangout, con una solicitud para unirme a la llamada. ¿Te preguntas si el enlace es correcto?