Wie aktualisiere ich eine Struct-Eigenschaft in Solidity?

Ich versuche, den Wert einer der Requisiten in structeinem Soliditätsvertrag zu aktualisieren.

Das Aktualisieren einer Variablen funktioniert gut, wenn sie sich nicht in einer Struktur befindet. Aber wenn ich versuche, einen Wert in einem structähnlichen Vertrag unten zu aktualisieren, wird Gas verwendet, um die Verträge wie erwartet zu aktualisieren, aber wenn ich den aktualisierten Wert lese, wurde er nicht geändert.

Kann jemand sehen, warum meine Vertragsdefinition falsch ist?

Mein Vertrag ist definiert als:

Benutzer.sol

pragma solidity ^0.4.17;

contract Users {
    struct User {
        string firstName;
        string lastName;
    }
    mapping(address => User) public users;

    function getFirstName() public view returns (string) {
        User memory user = users[msg.sender];
        return user.firstName;
    }

    function setFirstName(newName) public {
        User memory user = users[msg.sender];
        user.firstName = newName;
    }
}

Ich bin neu in der Arbeit mit Solidity, daher ist jede Hilfe willkommen.

Antworten (2)

Diese Linie:

User memory user = users[msg.sender];

Sollte storagestattdessen verwenden:

User storage user = users[msg.sender];

Wenn Sie verwenden memory, erstellen Sie eine Kopie der Struktur im Speicher und aktualisieren diese dann. Wenn Sie verwenden storage, erhalten Sie einen Verweis auf die Struktur im Speicher, sodass Ihre Änderungen beibehalten werden.

danke für die Antwort. tut mir leid, das geht nicht. Ich habe auch versucht, den Wert direkt mit: zu bearbeiten function setName(string newName) public { temps[msg.sender].name = newName; }, aber das funktioniert auch nicht.
Das sollte auch funktionieren (modulo setNamevs. setFirstNameund tempsvs. users). Können Sie beschreiben, wie Sie die Funktion aufrufen?
Wenn Sie von web3.js oder ähnlichem aus anrufen, stellen Sie sicher, dass Sie eine Transaktion senden und nicht nur eine ausführen call, die den Status nicht ändert.
function setFirstName(string newName) public { users[msg.sender]. firstName = newName; }. Ich verwende Web3 auf React-Native, was bei der Interaktion mit Verträgen gut funktioniert. Ich habe dieses Problem nur mit Strukturen. Ich rufe die Funktion von benutzerdefinierter Redux-Middleware auf (die ich getestet habe, um zu funktionieren).export const setFirstName = newName => ({ type: 'set first name', promise: ({ contracts, coinbase }) => contracts.Users.setFirstName(newName, { from: coinbase }) });
Warum fangen Sie nicht damit an, Ihren Code in Remix einzufügen und zu überprüfen, ob er dort funktioniert? Dann können Sie debuggen, was im Rest des Stapels vor sich geht ... vielleicht ist die Adresse falsch oder Ihr aktuellster Code wird nicht tatsächlich bereitgestellt oder so etwas.
Mir ist gerade aufgefallen, dass der Code in Ihrer Frage syntaktisch nicht korrekt ist. Bitte überprüfen Sie den genauen Code, den Sie jetzt verwenden, und bearbeiten Sie Ihre Frage so, dass sie diese Version des Codes enthält.
Es sieht so aus, als würde es wie erwartet am Remix arbeiten. Möglicherweise muss ich meine Redux-Middleware debuggen. Danke für deine Hilfe. Wenn ich die Lösung finde, werde ich sie in diesen Thread stellen.

Ich habe die Suche mit einem besseren Beispiel umformuliert. Ich glaube nicht, dass ich diesen Thread löschen sollte, weil es viele Möglichkeiten gibt, eine Frage zu formulieren. Stattdessen kann es sinnvoller sein, einen Link zur Lösung bereitzustellen:

Aktualisieren eines Werts in einer Struktur