Ich versuche, den Wert einer der Requisiten in struct
einem 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.
Diese Linie:
User memory user = users[msg.sender];
Sollte storage
stattdessen 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.
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:
X0r0N
function setName(string newName) public { temps[msg.sender].name = newName; }
, aber das funktioniert auch nicht.Benutzer19510
setName
vs.setFirstName
undtemps
vs.users
). Können Sie beschreiben, wie Sie die Funktion aufrufen?Benutzer19510
call
, die den Status nicht ändert.X0r0N
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 }) });
Benutzer19510
Benutzer19510
X0r0N