- Что такое opcodes?
- Что означает цепочка
Solidity → Байт-код → Opcodes? - Для чего необходимо базовое понимание opcodes?
- Что означает цепочка
- Известно, что opcodes условно делятся на несколько групп. Твоя задача, на каждую группу, привести в пример несколько opcodes и обозначить предназначение всей группы.
- Управление стеком.
- Арифметика
- Операции среды
- Управление памятью memory
- Управление памятью storage
- Управление program counter
- Остановка процесса
- За выполнение каждого opcode, требуется оплата за выполнение в сети. Оплата выражена в единицах, которые называются газ.
- В чем разница между базовой стоимостью выполнения opcode и динамической?
- Какой самый дорогой opcode? Сколько газа он требует?
- Что делает следующий байт-код? Какой будет результат выполнения?
6002600404600201
- Что такое бит и байт, в чем отличие?
- Что такое знаковые и беззнаковые числа в контексте битов?
- Какие бывают виды знаковых чисел? Какой вид самый используемый?
- Как работают прямой, обратный и дополнительный код? Какие проблемы могут возникнуть в прямом и обратном коде?
- Что такое битовые операции?
- Какие существуют битовые операции?
- Что такое логические вентили?
- Какие действия можно выполнять с битами используя битовые операции?
- Что такое битовые сдвиги?
- Как работают арифметический, логический и циклический сдвиги? В чем отличия?
- Где используются битовые операции и для чего?
- Что происходит в этом коде? Как можно сделать то же самое по-другому?
function bitOperation(uint8 number, uint8 index) external pure returns (uint256) { return number & ~(1 << index); }
- Двоичные числа
- Как два байта переслать
- Прямой, обратный и дополнительный код
- Видео: как работают отрицательные числа
- Bitwise operation
- Видео: как работать с битами
- Побитовые операции
-
Что такое Yul? Как и для чего он используется?
-
Как работает область видимости переменных в inline assembly вставках? Рассказать как будет работать код на примере ниже.
assembly { let x := 3 { let y := x } { let z := y } }
-
Какие есть типы данных в Yul, как объявляются переменные с этими типами?
-
Какие литералы допустимо использовать в коде Yul?
-
Рассказать про инструкции в Yul, в какой последовательности будет выполняться код ниже? Чему будет равен
xеслиa= 3,b= 6?let x := div(mul(a, b), add(a, b))
-
С помощью каких операторов выстраивается поток управления в Yul?
-
Как устроен тип памяти storage, какие два вида переменных существуют в storage?
- Как работает упаковка слотов в storage? Как записывать и извлекать значения из упакованных слотов?
- Как хранятся структуры в storage?
- Как хранятся массивы с фиксированной длиной? Где хранится длина массива?
- Как хранятся динамические массивы? Где хранится длина и как получить доступ к индексу массива? Как получить доступ к динамическому массиву вложенному в динамический массив?
- Как хранятся mappings? Как получить доступ к элементу mapping? Как получит доступ к mapping вложенному в mapping? Как получить доступ к массиву вложенному в mapping?
- Как хранятся массив байтов и строки? Какая есть особенность?
- Какие есть инструкции для работы со storage в Yul?
-
Как устроен тип памяти memory? Для чего используется тип памяти memory?
- Когда переменные инициализируются в memory и когда очищаются?
- Какая есть особенность при работе с memory? Можно ли записывать что-то в первые 128 байт? Как они используются Solidity?
- Как получить указатель на свободное место в memory?
- Очищается ли memory автоматически при переключении с кода solidity на inline assembly и наоборот?
- Какие есть инструкции для работы с memory в Yul?
- Как хранятся структуры в memory?
- Как хранятся массивы фиксированной длины и динамические массивы?
- Как хранятся массивы байтов и строки?
- Как работают инструкции
revertиreturn? - Как работает
keccak256в memory?
-
Как устроен тип памяти calldata?
- Для чего используется тип данных calldata?
- Почему работать с calldata дешевле по газу чем с memory?
- Какие инструкции в Yul есть для работы с типом данных calldata?
- Как в calldata хранятся массивы?
- Как в calldata хранятся массивы байтов и строки?
- Как сделать срез данных (array slice), для чего это нужно?
-
Как в Yul выполняется вызов смарт-контрактов?
- Какие инструкции используются для вызова смарт-контрактов?
- Как работает инструкция
call(g, a, v, in, insize, out, outsize)? - Как обрабатываются возвращаемые данные?
-
Как работать с событиями в Yul?
- Рассказать что происходит в функции
foo:contract EmitEvent { event SomeLog(uint256 indexed a, uint256 indexed b, bool c); function foo() external { assembly { let signature := 0x39cf0823186c1f89c8975545aebaa16813bfc9511610e72d8cff59da81b23c72 let ptr := mload(0x40) mstore(ptr, 1) log3(0x80, 0x20, signature, 2, 3) } } }
- Рассказать что происходит в функции
-
Можно ли писать смарт-контракты на чистом Yul?