209 похожих чатов

Господа знающие ассембли По идее в структуре данные в памяти располагаются

рядом, то есть
Структура
М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))
}
}
}

При инициализации структуры через солидити, геттер ассембли видит только х,
Потому что по идее на у я ищу данные не по тому адресу в памяти

Так вот вопрос при инициализации через солидити, как найти у через ассембли?

1 ответов

14 просмотров

sstore и sload оперируют сторадж слотами, а не байтами. Т.е. когда ты хочешь записать и прочитать сторадж слот, ты указываешь номер слота, а не байт. Твоя структура будет использовать два последовательных слота: 0 и 1. `sstore(add(myStruct.slot, 0x20), _y)` пишет в 32 слот, вместо 1. `sload(add(myStruct.slot, 0x20))` читает из 32ого слота, вместо 1. Поэтому и расхождение. Попробуй номер слота `add(myStruct.slot, 0x1)` для чтения и записи _y

Похожие вопросы

Обсуждают сегодня

Карта сайта