Solidity-Funktion, die Mapping als Eingabe akzeptiert

Kann Solidity Zuordnungen als Eingabeparameter in einer Funktion akzeptieren? Ich habe versucht, eine Funktion mit einer zweiten Parameterzuordnung (String => String) aMapping zu erstellen,

pragma solidity ^0.4.6;

contract testInputArray {
    // Events
    event LogFunctionWithMappingAsInput(address from, address to, string message);

    function sendMessage(address to, mapping (string => string) aMapping) {
        LogFunctionWithMappingAsInput(msg.sender, to, aMapping["test1"]);
    }
}

aber der Compiler wirft den folgenden Fehler:

Untitled:7:35: Error: Type is required to live outside storage.

Gemäß Kann ich Mapping als Funktionsargumente aufrufen? Die Funktion muss intern oder privat sein, um eine Wrapping-Struktur zu akzeptieren, aber ich muss die Funktion von außerhalb des Vertrags direkt durch eine Ethereum-Transaktion aufrufbar sein.

Gibt es eine Möglichkeit, eine Zuordnung (assoziatives Array oder Wörterbuch) als Eingabeparameter in Solidity zu übergeben? Vielen Dank!

Ref.:

Sie können eine Zuordnung nicht übergeben, da sie so groß werden können, dass es unmöglich wäre, in derselben Transaktion von einem Vertragsspeicher auf einen anderen zu kopieren. ethereum.stackexchange.com/a/24519/3573

Antworten (1)

Sie können nicht das gesamte Mapping bestehen. Sie könnten eine Struktur intern übergeben. Idealerweise würden Sie die Felder aufzählen, die Sie wirklich übergeben müssen, damit Sie eine Schnittstelle erstellen können, die mit anderen Verträgen und Kunden funktioniert.

Ihr obiges Beispiel scheint ein einzelnes Mitglied der Quellzuordnung zu übergeben. Ich würde das ungefähr so ​​interpretieren:

pragma solidity ^0.4.6;

contract testInputArray {

    mapping (string => string) aMapping;

    // Log event to print the message details
    event Log(address from, address to, string message);

    function sendMessage(address to, string key) {
        Log(msg.sender, to, aMapping[key]);
    }
}

Ich hoffe es hilft.

PS Es wäre nachlässig, die übliche Bevorzugung von bytes32 gegenüber string wegzulassen, wenn dies in diesem Fall möglich ist. Habe es der Übersichtlichkeit halber als String belassen.

Sie können einen Speicherzeiger an mappjng übergeben, aber nur intern.