Solidity. Смарт контракты и аудит
2.62K subscribers
246 photos
7 videos
18 files
555 links
Обучение Solidity. Уроки, аудит, разбор кода и популярных сервисов
Download Telegram
Урок 15. Работа с памятью в Solidity

Еще один сложный для понимания урок, который я пересматривал несколько раз.

Для меня лично, проблемы возникли не только с пониманием организации памяти, но и с добавление языка Yul, который я раньше не встречал в своей практике.

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

Видео урок - работа с памятью

К данному уроку можно вернуться в любой момент, так как он просто рассказывает про внутреннюю работу языка Solidity.

И, на данный момент, я встречал в различных видео всего раза два, когда требовалось использовать assembly и вытаскивать из памяти селектор или другие значение. Уверен, это уже знания продвинутого разработчика Solidity.

Я в течение дня все также буду выкладывать скрины и пояснения кода и работы памяти.

#урок #memory #calldata
🔥1
Solidity резервирует 4 слота памяти, которые хранят в себе до 32 байтов, где первые два слота или 64 байта - это некое служебное пространство, оно уже использкется по умолчанию, и мы не будем обращаться к нему напрямую. Следующие 32 байта хранят в себе указатель на свободное место в памяти, который как бы говорит, что с этого момента ты можешь что-то записать в память. Потом идет пустой слот, после которого мы можем записывать свои данные.

Для того, чтобы обращаться к слотам памяти используют Yul (код с assemly в видео).

Чтобы найти значение строки, которое возвращается в bytes32, нужно найти указатель в памяти, а затем вычесть из него предполагаемый размер данных в байтах. Например, строка "test" точно поместится в 32 байта, поэтому код будет выглядеть как на скрине.

#accembly #memory #calldata #yul
🔥1
Массивы с фиксированной длиной хранятся немного иначе, чем строки. Перед указателем будет размещаться последнее значение массива. А чтобы найти другие значение необходимо вычитать по 32 байта. 

#accembly #memory #calldata #yul
🔥1
В случае с вызовом данных нашей функции, в первых 4 байтах находится селектор самой функции.

#accembly #memory #calldata #yul
🔥1
Основное различие calldata от memory заключается в том, что при использовании memory тратится больше газа, так как его можно перезаписывать.

Calldata же является неизменным значением. Другими словами, мы можем использовать calldata в своих функциях, но изменить его значение у нас не получится.

#accembly #memory #calldata #yul
🔥1
Чтобы получить селектор функции, можно использовать следующую функцию. Более того, данный селектор функции можно найти в artifacts/myContract.json в блоке methodIdentifiers.

#memory #calldata #yul
🔥1
Чтобы найти первый элемент массива с фиксированной длинной в calldata, нам необходимо пропустить первые 4 байта, которые содержат селектор функции.

#accembly #memory #calldata #yul
🔥1
Найти строку в calldata немного сложнее. Так как после селектора есть еще 32 байта, после которых начинается информация о строке. Потом еще слот с байтовой длинной самой строки, и только после этого значение строки.

#accembly #memory #calldata #yul
🔥1
Найти строку в calldata немного сложнее. Так как после селектора есть еще 32 байта, после которых начинается информация о строке. Потом еще слот с байтовой длинной самой строки, и только после этого значение строки.

#accembly #memory #calldata #yul
🔥1
Найти массив с динамической длинной в calldata можно так. Сначала в слотах хранится селектор, потом количество элементов в массиве или его длина, затем идет первый элемент нашего массива.

#accembly #memory #calldata #yul
🔥1