Estoy tratando de actualizar el valor de uno de los accesorios en un struct
contrato de solidez.
actualizar una variable funciona bien si no está en una estructura. pero cuando trato de actualizar un valor struct
como en el contrato a continuación, el gas se usa para actualizar los contratos como era de esperar, pero cuando leo el valor actualizado, no ha cambiado.
¿Alguien puede ver cómo la definición de mis contratos es incorrecta?
Mi contrato se define como:
Usuarios.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;
}
}
Soy nuevo en trabajar con Solidity, por lo que se agradece cualquier ayuda.
Esta línea:
User memory user = users[msg.sender];
Debería usar en su storage
lugar:
User storage user = users[msg.sender];
Si usa memory
, entonces está haciendo una copia de la estructura en la memoria y luego actualizándola. Si usa storage
, obtendrá una referencia a la estructura almacenada, por lo que sus modificaciones se conservarán.
Reformulé la búsqueda con un mejor ejemplo. No creo que deba eliminar este hilo porque hay muchas maneras de formular una pregunta. en cambio, puede ser más útil proporcionar un enlace a la solución:
X0r0N
function setName(string newName) public { temps[msg.sender].name = newName; }
, pero tampoco funciona.usuario19510
setName
vs.setFirstName
ytemps
vs.users
). ¿Puedes describir cómo llamas a la función?usuario19510
call
, que no modifica el estado.X0r0N
function setFirstName(string newName) public { users[msg.sender]. firstName = newName; }
. estoy usando web3 en react-native, que funciona bien al interactuar con contratos. Solo tengo este problema con las estructuras. estoy llamando a la función desde el middleware redux personalizado (que he probado para que funcione)export const setFirstName = newName => ({ type: 'set first name', promise: ({ contracts, coinbase }) => contracts.Users.setFirstName(newName, { from: coinbase }) });
usuario19510
usuario19510
X0r0N