Senden des String-Parameterwerts an die Solidity-Methode

Ich versuche, einen String-Parameterwert an eine Solidity-Methode zu senden, aber ich kann den Rückgabewert nicht abrufen. Dies ist mein Soliditätscode:

contract Entity{
    event Entities(string name);
    struct Entity{
        string name;
    }
    uint32 public entityId;
    mapping(uint32 => Entity) entities;
    function insert(string name) returns (uint32 returnId){
         returnId = ++entityId;
         entities[returnId] = Entity(name);
         Entities(name);
         return returnId;
    }
}

und so versuche ich, über die JSON RPC-API damit zu interagieren

curl --data '{"jsonrpc":"2.0","method": "eth_call", "params": [{"from": "0xec1466c6fa38de0506e14fe8e5b51e95d3f80b11","to":"0xbd46d45c440ae02a76938043af18cc75ac569e4b","data":"0xb1498e29456e746974792042000000000000000000000000000000000000000000000000"}], "id": 6}'

Ich bekomme 0x als Ergebnis.

Antworten (1)

Ihre Methode ändert den Status des Vertrags (Blockkette), was bedeutet, dass Sie keine Werte erhalten können, da die Transaktion (Aufruf der Methode) zum Zeitpunkt der Rückgabe des Aufrufs möglicherweise nicht abgebaut wurde (es gibt keine berechnete ID zurückzugeben).

Sie erhalten den Hash der Transaktion und müssen warten, bis der Code ausgeführt (geschürft) wird. Nur dann können Sie die ID abrufen, indem Sie eine Methode aufrufen, die nur einen Lesevorgang für den Vertrag durchführt.

Sie müssen der Transaktion für den Anruf auch Gaskosten zuweisen, da Sie einen Miner bitten, ihn für Sie auszuführen. Verwenden Sie den Geth -IPC, da dies weit weniger umständlich ist, als JSON-Objekte auf den Client zu werfen:

entityContract.insert("my_string", {from:eth.accounts[0],gas:100000000});

wobei entityContract eine Vertragsinstanz ist, die aus ihrer ABI und Adresse erstellt wurde.

Im Falle des Sendens einer Transaktion muss sie abgebaut werden, wenn ich mich nicht irre, aber hier rufe ich nur die Methode auf, die im Grunde einen Wert hätte zurückgeben sollen, aber das passiert nicht
Sie ändern den Vertragsstatus in Ihrer Methode, indem Sie die entityId erhöhen.
Dies wird im Grunde intern passieren, aber da ich keine Transaktion sende, ändert sich der Status nicht und es wird wieder auf das Original zurückgesetzt, nehme ich an
Entfernen Sie in Ihrem Vertrag returnIdvon uint32 returnId. Nein, Sie führen immer noch Berechnungen in der Blockchain durch, also muss jemand für diese Taktzyklen bezahlen, auch wenn das Ergebnis nicht in der Blockchain gespeichert ist (Sie müssen sowohl für die Speicherung als auch für die ausgeführten Anweisungen bezahlen).
Das Pament, was Sie erwähnen, ich denke, Blockchain tut das automatisch, wenn Sie es nicht im Code erwähnen
Und mit uint32-Parametern funktioniert dies nur mit dynamischen Datentypen. Ich habe nur Zeichenfolgen ausprobiert, denke aber trotzdem
Nein, tut es nicht. Sie müssen den Saldo manuell angeben.
versucht, das Gas für eine bestimmte Anfrage zu erwähnen, aber die Antwort ist immer noch dieselbe