Я пытаюсь обновить значение одного из реквизитов в 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, поэтому любая помощь приветствуется.
Эта строка:
User memory user = users[msg.sender];
storage
Вместо этого следует использовать :
User storage user = users[msg.sender];
Если вы используете memory
, вы делаете копию структуры в памяти, а затем обновляете ее. Если вы используете storage
, вы получите ссылку на структуру в хранилище, поэтому ваши изменения будут сохранены.
я перефразировал квест с лучшим примером. я не думаю, что мне следует удалять эту тему, потому что есть много способов сформулировать вопрос. вместо этого может быть полезнее предоставить ссылку на решение:
X0r0N
function setName(string newName) public { temps[msg.sender].name = newName; }
, но это тоже не работает.пользователь19510
setName
vs.setFirstName
иtemps
vs.users
). Можете ли вы описать, как вы вызываете функцию?пользователь19510
call
, который не изменяет состояние.X0r0N
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 }) });
пользователь19510
пользователь19510
X0r0N