wie man eine verschachtelte for-Schleife erstellt, die den Hash-Wert für jeden speichert

Ich habe zwei Arrays:

address[ ] addresses
uint [ ] numbers

Ich möchte eine Funktion erstellen, die ein weiteres Array erstellt, das den Hash-Wert von beiden speichert.

bytes32[ ] addressNumbers

zum Beispiel, wenn ich zwei Adressen und zwei Uints gespeichert habe:

address[address1, address2] addresses,
uint [1, 2] numbers.

Ich möchte sie keccak256(address, uint)so hashen, dass ich ein Array bekomme:

bytes 32[ address1,1 ,address1,2 , address2,1 , address2,2 ] 
addressNumbers

Ich nehme an, ich muss eine verschachtelte for-Schleife verwenden, aber ich habe Probleme, herauszufinden, wie. kann mir einer von euch helfen?

Anpassung an die Funktionsweise von Ethereum erforderlich. Was werden Sie mit den Hashes machen?
Es bezieht sich auf eine andere Frage hier: ethereum.stackexchange.com/questions/13994/… Ich möchte die beiden Arrays verbinden, um für jeden Wähler zu jedem Thema VoterIssues zu erstellen.

Antworten (1)

Was Sie tun können, ist, es als viele-zu-viele-Verknüpfung zwischen zwei Tabellen, Voters und Issues, zu behandeln. Die Beziehung wird normalerweise mit einer dritten Tabelle angesprochen, in diesem Fall Vote (oder Ballet, wenn es die Verwirrung verringert).

Zusammenfassend schieben Sie Wähler und Probleme in Tabellen (Arrays oder Zuordnungen mit Indizes). Einige Muster hier: Gibt es gut gelöste und einfache Speichermuster für Solidity?

Wählen Sie ein Muster aus, mit dem Sie einfach bestätigen können, dass ein Wähler tatsächlich registriert ist und tatsächlich ein Problem besteht. Hashen Sie dann die Schlüssel und schieben Sie eine Stimme in die Abstimmungstabelle.

Mit "Tabelle" meine ich eines der in der oben verlinkten Antwort beschriebenen Konstrukte. Denken Sie über die Stärken und Schwächen nach und wählen Sie entsprechend aus. Für die Stimmen selbst würde ich Folgendes berücksichtigen:

struct Vote {
  bool yayNay;
  bool isVote;
}

mapping(she3HashKey => Vote) voteStructs;

Das zweite Feld würde für alle abgegebenen Stimmen auf wahr gesetzt, sodass Sie ein echtes „falsch“ von einer standardmäßigen 0 unterscheiden können, weil ...

In meinem Ansatz benötigen Sie einfache Funktionen, um zu überprüfen, ob Dinge vorhanden sind:

isVoter() public constant returns(bool isIndeed) {}
isIssue() public constant returns(bool isIndeed) {}
isVote()  public constant returns(bool isIndeed) {}

Das ist ein Muss, sonst verstricken Sie sich womöglich in knifflige Probleme, zB das Unterscheiden einer Vorgabe (false) von einem tatsächlichen „Nein“.

Überprüfen Sie die ersten beiden, bevor Sie eine neue Abstimmung zulassen.

if(!isVoter(msg.sender)) throw;
if(!isIssue(issueId)) throw;
// continue ... 

Überprüfen Sie die dritte, bevor Sie irgendetwas mit einer gespeicherten Stimme tun.

Behalten Sie Ihre Bilanzen, während Sie fortfahren, damit Sie Iterationen um jeden Preis vermeiden können.

Ich hoffe es hilft.