Как обновить свойство структуры в Solidity

Я пытаюсь обновить значение одного из реквизитов в structконтракте на прочность.

обновление переменной отлично работает, если она не находится в структуре. но когда я пытаюсь обновить значение, как structв приведенном ниже контракте, газ используется для обновления контрактов, как я и ожидал, но когда я прочитал обновленное значение, оно не было изменено.

Может ли кто-нибудь увидеть, как мое определение контрактов неверно?

Мой контракт определяется как:

Пользователи.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;
    }
}

Я новичок в работе с Solidity, поэтому любая помощь приветствуется.

Ответы (2)

Эта строка:

User memory user = users[msg.sender];

storageВместо этого следует использовать :

User storage user = users[msg.sender];

Если вы используете memory, вы делаете копию структуры в памяти, а затем обновляете ее. Если вы используете storage, вы получите ссылку на структуру в хранилище, поэтому ваши изменения будут сохранены.

Спасибо за ответ. извините, это не работает. Я также пробовал редактировать значение напрямую с помощью: function setName(string newName) public { temps[msg.sender].name = newName; }, но это тоже не работает.
Это тоже должно работать (по модулю setNamevs. setFirstNameи tempsvs. users). Можете ли вы описать, как вы вызываете функцию?
Если вы звоните из web3.js или чего-то подобного, убедитесь, что вы отправляете транзакцию, а не просто выполняете call, который не изменяет состояние.
function setFirstName(string newName) public { users[msg.sender]. firstName = newName; }. я использую web3 на реактивном языке, который отлично работает при взаимодействии с контрактами. у меня проблема только со структурами. я вызываю функцию из пользовательского промежуточного программного обеспечения redux (которое я проверил на работу)export const setFirstName = newName => ({ type: 'set first name', promise: ({ contracts, coinbase }) => contracts.Users.setFirstName(newName, { from: coinbase }) });
Почему бы вам не начать с того, что поместите свой код в Remix и убедитесь, что он там работает? Затем вы можете отладить то, что происходит в остальной части стека... возможно, адрес неверен, или ваш самый последний код на самом деле не развертывается, или что-то в этом роде.
Я только что заметил, что код в вашем вопросе синтаксически неверен. Пожалуйста, дважды проверьте, какой точный код вы используете сейчас, и отредактируйте свой вопрос, чтобы включить эту версию кода.
похоже, он работает над ремиксом, как и ожидалось. мне может понадобиться отладить промежуточное программное обеспечение Redux. спасибо за помощь. если я найду решение, я помещу его в эту тему.

я перефразировал квест с лучшим примером. я не думаю, что мне следует удалять эту тему, потому что есть много способов сформулировать вопрос. вместо этого может быть полезнее предоставить ссылку на решение:

Обновление значения в структуре