Solidity. Смарт контракты и аудит
2.63K subscribers
246 photos
7 videos
18 files
547 links
Обучение Solidity. Уроки, аудит, разбор кода и популярных сервисов
Download Telegram
Игры с байткодом

Байткод контрактов обычно начинается с 6080604052, который генерируется за счет операции mstore(0x40,0x80). Но возможен и такой вариант:

Попробуйте выполнить операцию mstore(0x40,returndatasize()) в самом начале. Ваш байткод будет начинаться с 3d604052!

Пример кода можно увидеть на скрине выше.

P.S. По слухам, это может помешать верификации на Etherscan, так что пробуйте с осторожностью.  

#bytecode #tip
1👍1
Solidity hints. Часть 16

Последний пост перед небольшим перерывом с циклом Solidity Hints, так как на следующей неделе мы поговорим про Account Abstractions.

Итак:

25. For values of immutable variables, 32 bytes are reserved in the code, even if they would fit in fewer bytes
26. The compiler does not reserve a storage slot for constant and immutable variables, and every occurrence is replaced by the respective value directly in the code.


что в переводе:

25. Для значений immutable переменных всегда резервируется 32 байта памяти, не смотря на то, что сами значения могут по итогу заниматься меньше места.
26. Компилятор не резервирует слот для хранения постоянных и неизменяемых переменных, и каждое их вхождение заменяется соответствующим значением непосредственно в коде.

Я решил объединить эти пункты, так как разбор описывает оба этих случая.

Если вы хоть раз интересовались работой памяти в Solidity, то наверняка слышали рекомендацию по упаковке в правильный порядок переменных состояния контракта, чтобы они занимали меньше места. Например,

uint256 - занимает весь слот памяти в 32 байта;

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

address занимает 20 байтов, а bool - всего 1.

Зная размерность наших переменных мы может сгруппировать их таким образом, чтобы они компактно размещались в памяти.

При этом два вида переменных, constant и immutable - размещаются не в памяти контракта, а в его байткоде.

Значение переменной константы, при деплое контракта, просто копируется во все места в самом контракте, где к ней обращаются. Для значений immutable переменной происходит тоже самое, только для нее резервируется 32 байта, даже если значение занимает гораздо меньше места. Именно поэтому константы иногда могут быть дешевле по газу, чем immutable переменные.

#immutable #constant #storage #bytecode
👍4