Я не знаю, является ли это причудой IDE для ремиксов или что-то, что Solidity делает сама, но я нашел кое-что интересное и хотел бы знать, почему это происходит.
У меня есть структура x в контракте Y, который имеет два поля:
Struct X {
address owner;
address renter;
}
Теперь, когда я инициализирую структуру, вызвав функцию createX() в IDE remix:
function createX() public {
X storage x;
x.owner = msg.sender;
}
Поле адреса арендатора получает значение адреса контракта Y
Почему это происходит? Я ожидал, что поле будет равно нулевому адресу.
Компилятор Solidity должен выдать предупреждение об этом.
X storage x;
объявляет неинициализированную ссылку на хранилище. Это означает x
, что указывает на слот 0 в хранилище. Когда вы сохраняете msg.sender
в x.owner
, он перезаписывает все, что было в слоте 0 (первая объявленная вами переменная состояния). x.renter
, так как вы не изменили его, все равно должен содержать то, что было вашей второй объявленной переменной состояния.
Гейб