web-dev-qa-db-ja.com

Solidityでマッピングリストを返す方法は? (イーサリアム契約)

リストを持ち、アイテムを設定し、リストを取得できるシンプルなスマートコントラクトを作りたい。

強固なコード:

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

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

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

GetList()にリストを返させたいのですが、戻り値の型に互換性がありません。どうやってやるの?

16
6londe

Solidityでは、リスト/配列/その他への一括アクセスは困難です。あなたはめったに契約でそれを見ません。あなたの場合、可能な解決策は、インデックスを使用してoneアイテムにアクセスする関数を提供し、呼び出し元に0からidまでループさせることです。

17
bortzmeyer

変数listの可視性を変更し、挿入publicを変更すると、getListを使用してこれにアクセスできます。

mapping(int => string) public list;

1
HLeite

マッピングを使用すると、キーは保存されず、値を反復することができないため、単一値のルックアップにのみ適しています。あなたが提供する例では、配列を使用する方が良い選択かもしれません。

一方、配列を使用してそれを検索する必要がある場合(すべての項目をループする)、配列に項目が多すぎるとかなりのコストがかかる可能性があるため、注意が必要です。関数を呼び出すガス。

1
Alex