¿Cómo actualizo una propiedad de estructura en Solidity?

Estoy tratando de actualizar el valor de uno de los accesorios en un structcontrato de solidez.

actualizar una variable funciona bien si no está en una estructura. pero cuando trato de actualizar un valor structcomo 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.

Respuestas (2)

Esta línea:

User memory user = users[msg.sender];

Debería usar en su storagelugar:

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.

gracias por la respuesta. lo siento, eso no funciona. También he intentado editar el valor directamente con: function setName(string newName) public { temps[msg.sender].name = newName; }, pero tampoco funciona.
Eso también debería funcionar (módulo setNamevs. setFirstNamey tempsvs. users). ¿Puedes describir cómo llamas a la función?
Si está llamando desde web3.js o similar, asegúrese de enviar una transacción y no solo hacer un call, que no modifica el estado.
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 }) });
¿Por qué no empiezas poniendo tu código en Remix y verificas que funciona allí? Luego puede depurar lo que sucede en el resto de la pila... tal vez la dirección sea incorrecta o su código más reciente no se implemente realmente, o algo así.
Acabo de notar que el código en tu pregunta no es sintácticamente correcto. Vuelva a verificar cuál es el código exacto que está usando ahora y edite su pregunta para incluir esa versión del código.
parece que está trabajando en remix como se esperaba. Es posible que deba depurar mi middleware redux. Gracias por tu ayuda. Si encuentro la solución la pondré en este hilo.

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:

Actualización de un valor en una estructura