Solidity Maps Inhaltsauflistung mit Schleifen

Ich entwickle ein Testszenario in Remix (Solidity). Ich habe ein paar Beispielcodes gesehen, bin mir aber immer noch nicht sicher, wie das gemacht wird. Ich habe einen Beispielcode (nicht vollständig) angehängt, der dies verdeutlichen würde.

Ich habe zwei Fragen zu folgendem Szenario:

  1. So erstelle ich eine Schleife für die Karte, um die aktuelle Liste der registrierten Teilnehmer auszudrucken. Dazu verwende ich Events. Aber ich brauche eine Schleife, um über die registrierten Teilnehmer zu gehen.
  2. Wenn ich Teilnehmer lösche. Wie kann ich das Array der registrierten Schlüssel behandeln? TeilnehmerSchlüssel

Danke,

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;

    }

}

Antworten (1)

Hier ist ein Umdenken erforderlich. Willkommen bei Ethereum. ;-)

Sie können die Schlüssel in einem Mapping nicht iterieren. Im Wesentlichen existieren alle Schlüssel.

Außerdem ist es ein Antimuster, um eine unbegrenzte Liste zu durchlaufen. Irgendwann geht ihm aufgrund des BlockgasLimits das Gas aus.

Daher möchten Sie mit kleinen Funktionen fortfahren, die in jeder Größenordnung ungefähr gleich viel Benzin kosten. Das bedeutet normalerweise, dass die iterativen Prozesse an die Kunden weitergegeben werden und eine „One-Pass“-Logik im Vertrag erstellt wird.

Achten Sie darauf, dass der Vertragsstatus jederzeit „vollständig“ ist, um Rennbedingungen und andere Verrücktheiten zu vermeiden.

Schauen Sie hier nach Mapped Struct with Index, das ziemlich nah an dem ist, was Sie wollen: Gibt es gut gelöste und einfache Speichermuster für Solidity?

Ich hoffe es hilft.

Danke @RobHitchens. Der von Ihnen bereitgestellte Link führt mich zu einer Google-Hangout-Seite und wird zu Andrews Hangout-Sitzung umgeleitet – mit der Bitte, an dem Anruf teilzunehmen. Sie fragen sich, ob der Link richtig ist?