2016-06-03 9 views
9

Ich möchte einen einfachen Smart-Vertrag, der eine Liste hat, kann Element einstellen, und kann die Liste zu bekommen.Wie Mapping-Liste in Solidität zurückgeben? (Ethereum Vertrag)

-Code in Solidität:

contract lister { 
    mapping(int => string) list; 
    int id = 0; 

    function getList() returns (/*HERE*/) { 
     return list; 
    } 

    function setItemToList(string str) { 
     list[id] = str; 
     id++; 
    } 
} 

Ich möchte getList() geben die Liste machen, aber Art Rückkehr ist nicht kompatibel. Wie kann ich das tun?

Antwort

8

Bulk-Zugriff auf Listen/Arrays/etc ist in Solidität schmerzhaft. Sie sehen es selten in Verträgen. In Ihrem Fall besteht eine mögliche Lösung darin, eine Funktion zum Zugriff auf ein Element bereitzustellen, die seinen Index verwendet, und den Anrufer von 0 bis ID durchlaufen zu lassen.

+0

Ich bin vertraut mich nur mit Solidität, aber das ist mir erstaunlich. Wie kann eine nützliche Anwendung erstellt werden? Sollen wir _actually_ Daten irgendwo anders (in einer Nicht-Ethereum-App) persistieren und dapps verwenden, um damit zu interagieren und die Datenintegrität zu verifizieren? – imnotquitejack

1

Mit Zuordnungen werden Schlüssel nicht gespeichert und die Werte können nicht iteriert werden, so dass sie wirklich nur für Einzelwert-Lookups geeignet sind. In dem von Ihnen bereitgestellten Beispiel ist es möglicherweise besser, ein Array zu verwenden.

Auf der anderen Seite, wenn Sie ein Array verwenden und suchen müssen (Schleife durch alle Elemente), müssen Sie vorsichtig sein, wenn es zu viele Elemente in Ihrem Array, könnte es am Ende kosten eine beträchtliche Menge an Gas, um die Funktion aufzurufen.

1

Sie können die Sichtbarkeit Ihrer variablen Liste ändern, legen öffentlichen und es wird möglich, dies durch getList zuzugreifen.

mapping(int => string) public list;