рядом, то есть
Структура
МyStruct {
uint256 x;
uint256 y;
}
В памяти такое должно по идее выглядеть так что первые 32байта на х, вторые 32 на у
К чему это все, хочу через ассембли менять структуры в сторедже, с примитивными переменными все понятно.
Вот контракт
contract Storage {
struct MyStruct {
uint256 x;
uint256 y;
}
MyStruct public myStruct;
function initStruct(uint256 _x, uint256 _y) public {
myStruct.x = _x;
myStruct.y = _y;
}
function initStructAssembly(uint256 _x, uint256 _y) public {
assembly {
sstore(myStruct.slot, _x)
sstore(add(myStruct.slot, 0x20), _y)
}
}
function getStruct() public view returns(uint256, uint256) {
return (myStruct.x, myStruct.y);
}
function getStructAssembly() public view returns(uint256 x, uint256 y) {
assembly {
x := sload(myStruct.slot)
y := sload(add(myStruct.slot, 0x20))
}
}
}
При инициализации структуры через солидити, геттер ассембли видит только х,
Потому что по идее на у я ищу данные не по тому адресу в памяти
Так вот вопрос при инициализации через солидити, как найти у через ассембли?
sstore и sload оперируют сторадж слотами, а не байтами. Т.е. когда ты хочешь записать и прочитать сторадж слот, ты указываешь номер слота, а не байт. Твоя структура будет использовать два последовательных слота: 0 и 1. `sstore(add(myStruct.slot, 0x20), _y)` пишет в 32 слот, вместо 1. `sload(add(myStruct.slot, 0x20))` читает из 32ого слота, вместо 1. Поэтому и расхождение. Попробуй номер слота `add(myStruct.slot, 0x1)` для чтения и записи _y
Обсуждают сегодня