|
5 | 5 | 1. Что такое opcodes? |
6 | 6 | - Что означает цепочка ```Solidity → Байт-код → Opcodes```? |
7 | 7 | - Для чего необходимо базовое понимание opcodes? |
8 | | -2. Известно, что opcodes условно делятся на несколько групп. Твоя задача на каждую группу привести в пример несколько opcodes и обозначить предназначение всей группы. |
| 8 | +2. Известно, что opcodes условно делятся на несколько групп. Твоя задача, на каждую группу, привести в пример несколько opcodes и обозначить предназначение всей группы. |
9 | 9 | - Управление стеком. |
10 | 10 | - Арифметика |
11 | 11 | - Операции среды |
|
17 | 17 | - В чем разница между базовой стоимостью выполнения opcode и динамической? |
18 | 18 | - Какой самый дорогой opcode? Сколько газа он требует? |
19 | 19 | 4. Что делает следующий байт-код? Какой будет результат выполнения? |
20 | | - > 6002600404600201 |
| 20 | + > 6002600404600201 |
21 | 21 |
|
22 | 22 | - [Evm opcodes](https://www.evm.codes/?fork=shanghai) |
23 | 23 | - [The Ethereum Virtual Machine — How does it work?](https://medium.com/mycrypto/the-ethereum-virtual-machine-how-does-it-work-9abac2b7c9e) |
|
36 | 36 | 10. Как работают арифметический, логический и циклический сдвиги? В чем отличия? |
37 | 37 | 11. Где используются битовые операции и для чего? |
38 | 38 | 12. Что происходит в этом коде? Как можно сделать то же самое по-другому? |
39 | | -```js |
40 | | - function bitOperation(uint8 number, uint8 index) external pure returns (uint256) { |
41 | | - return number & ~(1 << index); |
42 | | - } |
43 | | -``` |
44 | | - |
45 | | -- [Двоичные числа](https://asm.kcup.tusur.ru/Library/chapter%201/1-1.html) |
46 | | -- [Как два байта переслать](https://pikabu.ru/story/kak_dva_bayta_pereslat_7070913) |
47 | | -- [Прямой, обратный и дополнительный код](https://microkontroller.ru/programmirovanie-mikrokontrollerov-avr/pryamoy-obratnyiy-dopolnitelnyiy-kod-dvoichnogo-chisla/) |
48 | | -- [Видео: как работают отрицательные числа](https://www.youtube.com/watch?v=BIYiuy8WWiU) |
49 | | -- [Bitwise operation](https://en.wikipedia.org/wiki/Bitwise_operation) |
50 | | -- [Видео: как работать с битами](https://www.youtube.com/watch?v=qewavPO6jcA) |
51 | | -- [Побитовые операции](https://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B1%D0%B8%D1%82%D0%BE%D0%B2%D1%8B%D0%B5_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8) |
| 39 | + ```js |
| 40 | + function bitOperation(uint8 number, uint8 index) external pure returns (uint256) { |
| 41 | + return number & ~(1 << index); |
| 42 | + } |
| 43 | + ``` |
| 44 | + |
| 45 | +- [Двоичные числа](https://asm.kcup.tusur.ru/Library/chapter%201/1-1.html) |
| 46 | +- [Как два байта переслать](https://pikabu.ru/story/kak_dva_bayta_pereslat_7070913) |
| 47 | +- [Прямой, обратный и дополнительный код](https://microkontroller.ru/programmirovanie-mikrokontrollerov-avr/pryamoy-obratnyiy-dopolnitelnyiy-kod-dvoichnogo-chisla/) |
| 48 | +- [Видео: как работают отрицательные числа](https://www.youtube.com/watch?v=BIYiuy8WWiU) |
| 49 | +- [Bitwise operation](https://en.wikipedia.org/wiki/Bitwise_operation) |
| 50 | +- [Видео: как работать с битами](https://www.youtube.com/watch?v=qewavPO6jcA) |
| 51 | +- [Побитовые операции](https://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B1%D0%B8%D1%82%D0%BE%D0%B2%D1%8B%D0%B5_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8) |
52 | 52 |
|
53 | 53 | ## Yul |
54 | 54 |
|
55 | 55 | 1. Что такое Yul? Как и для чего он используется? |
56 | | -2. Как работает область видимости переменных в inline assembly вставках? Рассказать как будет работать код на примере ниже . |
57 | | - |
58 | | -```js |
59 | | - assembly { |
60 | | - let x := 3 |
| 56 | +2. Как работает область видимости переменных в **inline assembly** вставках? Рассказать как будет работать код на примере ниже. |
| 57 | + ```js |
| 58 | + assembly { |
| 59 | + let x := 3 |
61 | 60 |
|
62 | | - { |
63 | | - let y := x |
64 | | - } |
| 61 | + { |
| 62 | + let y := x |
| 63 | + } |
65 | 64 |
|
66 | | - { |
67 | | - let z := y |
| 65 | + { |
| 66 | + let z := y |
| 67 | + } |
68 | 68 | } |
69 | | - } |
70 | | -``` |
| 69 | + ``` |
71 | 70 |
|
72 | 71 | 3. Какие есть типы данных в Yul, как объявляются переменные с этими типами? |
73 | 72 | 4. Какие литералы допустимо использовать в коде Yul? |
74 | 73 | 5. Рассказать про инструкции в Yul, в какой последовательности будет выполняться код ниже? Чему будет равен `x` если `a` = 3, `b` = 6? |
75 | | - |
76 | | -```js |
77 | | - let x := div(mul(a, b), add(a, b)) |
78 | | -``` |
| 74 | + ```js |
| 75 | + let x := div(mul(a, b), add(a, b)) |
| 76 | + ``` |
79 | 77 |
|
80 | 78 | 6. С помощью каких операторов выстраивается поток управления в Yul? |
81 | 79 | 7. Как устроен тип памяти storage, какие два вида переменных существуют в storage? |
82 | | - |
83 | | - 7.1 Как работает упаковка слотов в storage? Как записывать и извлекать значения из упакованных слотов? |
84 | | - |
85 | | - 7.2 Как хранятся структуры в storage? |
86 | | - |
87 | | - 7.3 Как хранятся массивы с фиксированной длиной? Где хранится длина массива? |
88 | | - |
89 | | - 7.4 Как хранятся динамические массивы? Где хранится длина и как получить доступ к индексу массива? Как получить доступ к динамическому массиву вложенному в динамический массив? |
90 | | - |
91 | | - 7.5 Как хранятся маппинги? Как получить доступ к элементу маппинга? Как получит доступ к маппингу вложенному в маппинг? Как получить доступ к массиву вложенному в маппинг? |
92 | | - |
93 | | - 7.6 Как хранятся массива байтов и строки? Какая есть особенность? |
94 | | - |
95 | | - 7.7 Какие есть инструкции для работы со storage в Yul? |
96 | | - |
| 80 | + - Как работает упаковка слотов в storage? Как записывать и извлекать значения из упакованных слотов? |
| 81 | + - Как хранятся структуры в storage? |
| 82 | + - Как хранятся массивы с фиксированной длиной? Где хранится длина массива? |
| 83 | + - Как хранятся динамические массивы? Где хранится длина и как получить доступ к индексу массива? Как получить доступ к динамическому массиву вложенному в динамический массив? |
| 84 | + - Как хранятся mappings? Как получить доступ к элементу mapping? Как получит доступ к mapping вложенному в mapping? Как получить доступ к массиву вложенному в mapping? |
| 85 | + - Как хранятся массив байтов и строки? Какая есть особенность? |
| 86 | + - Какие есть инструкции для работы со storage в Yul? |
97 | 87 | 8. Как устроен тип памяти memory? Для чего используется тип памяти memory? |
98 | | - |
99 | | - 8.1 Когда переменные инициализируются в memory и когда очищаются? |
100 | | - |
101 | | - 8.2 Какая есть особенность при работе с memory? Можно ли записывать что-то в первые 128 байт? Как они используются Solidity? |
102 | | - |
103 | | - 8.3 Как получить указатель на свободное место в memory? |
104 | | - |
105 | | - 8.4 Очищается ли memory автоматически при переключении с кода solidity на inline assembly и наоборот? |
106 | | - |
107 | | - 8.5 Какие есть инструкции для работы с memory в Yul? |
108 | | - |
109 | | - 8.6 Как хранятся структуры в memory? |
110 | | - |
111 | | - 8.7 Как хранятся массивы фиксированной длины и динамические массивы? |
112 | | - |
113 | | - 8.8 Как хранятся массивы байтов и строки? |
114 | | - |
115 | | - 8.9 Как работают инструкции `revert` и `return`? |
116 | | - |
117 | | - 8.10 Как работает `keccak256` в memory? |
118 | | - |
| 88 | + - Когда переменные инициализируются в memory и когда очищаются? |
| 89 | + - Какая есть особенность при работе с memory? Можно ли записывать что-то в первые 128 байт? Как они используются Solidity? |
| 90 | + - Как получить указатель на свободное место в memory? |
| 91 | + - Очищается ли memory автоматически при переключении с кода solidity на inline assembly и наоборот? |
| 92 | + - Какие есть инструкции для работы с memory в Yul? |
| 93 | + - Как хранятся структуры в memory? |
| 94 | + - Как хранятся массивы фиксированной длины и динамические массивы? |
| 95 | + - Как хранятся массивы байтов и строки? |
| 96 | + - Как работают инструкции `revert` и `return`? |
| 97 | + - Как работает `keccak256` в memory? |
119 | 98 | 9. Как устроен тип памяти calldata? |
120 | | - |
121 | | - 9.1 Для чего используется тип данных calldata? |
122 | | - |
123 | | - 9.2 Почему работать с calldata дешевле по газу чем с memory? |
124 | | - |
125 | | - 9.3 Какие инструкции в Yul есть для работы с типом данных calldata? |
126 | | - |
127 | | - 9.4 Как в calldata хранятся массивы? |
128 | | - |
129 | | - 9.5 Как в calldata хрянятся массивы байтов и строки? |
130 | | - |
131 | | - 9.6 Как сделать срез данных (array slice), для чего это нужно? |
132 | | - |
| 99 | + - Для чего используется тип данных calldata? |
| 100 | + - Почему работать с calldata дешевле по газу чем с memory? |
| 101 | + - Какие инструкции в Yul есть для работы с типом данных calldata? |
| 102 | + - Как в calldata хранятся массивы? |
| 103 | + - Как в calldata хранятся массивы байтов и строки? |
| 104 | + - Как сделать срез данных (array slice), для чего это нужно? |
133 | 105 | 10. Как в Yul выполняется вызов смарт-контрактов? |
134 | | - |
135 | | - 10.1 Какие инструкции используются для вызова смарт-контрактов? |
136 | | - |
137 | | - 10.2 Как работает инструкция `call(g, a, v, in, insize, out, outsize)`? |
138 | | - |
139 | | - 10.3 Как обрабатываются возвращаемые данные? |
140 | | - |
| 106 | + - Какие инструкции используются для вызова смарт-контрактов? |
| 107 | + - Как работает инструкция `call(g, a, v, in, insize, out, outsize)`? |
| 108 | + - Как обрабатываются возвращаемые данные? |
141 | 109 | 11. Как работать с событиями в Yul? |
| 110 | + - Рассказать что происходит в функции `foo`: |
| 111 | + ```js |
| 112 | + contract EmitEvent { |
| 113 | + event SomeLog(uint256 indexed a, uint256 indexed b, bool c); |
142 | 114 |
|
143 | | - 11.1 Рассказать что происходит в функции `foo`: |
144 | | - |
145 | | - ```js |
146 | | - contract EmitEvent { |
147 | | - event SomeLog(uint256 indexed a, uint256 indexed b, bool c); |
148 | | - |
149 | | - function foo() external { |
150 | | - assembly { |
151 | | - let signature := 0x39cf0823186c1f89c8975545aebaa16813bfc9511610e72d8cff59da81b23c72 |
| 115 | + function foo() external { |
| 116 | + assembly { |
| 117 | + let signature := 0x39cf0823186c1f89c8975545aebaa16813bfc9511610e72d8cff59da81b23c72 |
152 | 118 |
|
153 | | - let ptr := mload(0x40) |
154 | | - mstore(ptr, 1) |
| 119 | + let ptr := mload(0x40) |
| 120 | + mstore(ptr, 1) |
155 | 121 |
|
156 | | - log3(0x80, 0x20, signature, 2, 3) |
| 122 | + log3(0x80, 0x20, signature, 2, 3) |
| 123 | + } |
157 | 124 | } |
158 | 125 | } |
159 | | - } |
160 | | - ``` |
161 | | - |
| 126 | + ``` |
162 | 127 | 12. Можно ли писать смарт-контракты на чистом Yul? |
163 | 128 |
|
164 | | -- [Docs: Yul](https://docs.soliditylang.org/en/latest/yul.html) |
165 | | -- [Docs: Layout of memory](https://docs.soliditylang.org/en/latest/internals/layout_in_memory.html) |
166 | | -- [Playlist: Mastering Solidity Assembly (YUL)](https://youtube.com/playlist?list=PL5hld-skrdFrxGUmmEbG1LBvYVyTE9M62&si=jwXH_rtSvoNfrDPg) |
167 | | -- [Article: Inline Assembly in Solidity: A Practical Starter’s Guide](https://medium.com/lumos-labs/inline-assembly-in-solidity-34d3ba2cfa7a) |
168 | | -- [Video: The Dark Arts of Yul](https://www.youtube.com/watch?v=ew3pfnb2_V8) |
| 129 | +- [Docs: Yul](https://docs.soliditylang.org/en/latest/yul.html) |
| 130 | +- [Docs: Layout of memory](https://docs.soliditylang.org/en/latest/internals/layout_in_memory.html) |
| 131 | +- [Playlist: Mastering Solidity Assembly (YUL)](https://youtube.com/playlist?list=PL5hld-skrdFrxGUmmEbG1LBvYVyTE9M62&si=jwXH_rtSvoNfrDPg) |
| 132 | +- [Article: Inline Assembly in Solidity: A Practical Starter’s Guide](https://medium.com/lumos-labs/inline-assembly-in-solidity-34d3ba2cfa7a) |
| 133 | +- [Video: The Dark Arts of Yul](https://www.youtube.com/watch?v=ew3pfnb2_V8) |
0 commit comments