|
215 | 215 | - [Видео: как работают отрицательные числа](https://www.youtube.com/watch?v=BIYiuy8WWiU) |
216 | 216 | - [Bitwise operation](https://en.wikipedia.org/wiki/Bitwise_operation) |
217 | 217 | - [Видео: как работать с битами](https://www.youtube.com/watch?v=qewavPO6jcA) |
218 | | -- [Побитовые операции](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) |
| 218 | +- [Побитовые операции](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) |
| 219 | + |
| 220 | +## Yul |
| 221 | + |
| 222 | +1. Что такое Yul? Как и для чего он используется? |
| 223 | +2. Как работает область видимости переменных в inline assembly вставках? Рассказать как будет работать код на примере ниже . |
| 224 | + |
| 225 | +```js |
| 226 | + assembly { |
| 227 | + let x := 3 |
| 228 | + |
| 229 | + { |
| 230 | + let y := x |
| 231 | + } |
| 232 | + |
| 233 | + { |
| 234 | + let z := y |
| 235 | + } |
| 236 | + } |
| 237 | +``` |
| 238 | + |
| 239 | +3. Какие есть типы данных в Yul, как объявляются переменные с этими типами? |
| 240 | +4. Какие литералы допустимо использовать в коде Yul? |
| 241 | +5. Рассказать про инструкции в Yul, в какой последовательности будет выполняться код ниже? Чему будет равен `x` если `a` = 3, `b` = 6? |
| 242 | + |
| 243 | +```js |
| 244 | + let x := div(mul(a, b), add(a, b)) |
| 245 | +``` |
| 246 | + |
| 247 | +6. С помощью каких операторов выстраивается поток управления в Yul? |
| 248 | +7. Как устроен тип памяти storage, какие два вида переменных существуют в storage? |
| 249 | + |
| 250 | + 7.1 Как работает упаковка слотов в storage? Как записывать и извлекать значения из упакованных слотов? |
| 251 | + |
| 252 | + 7.2 Как хранятся структуры в storage? |
| 253 | + |
| 254 | + 7.3 Как хранятся массивы с фиксированной длиной? Где хранится длина массива? |
| 255 | + |
| 256 | + 7.4 Как хранятся динамические массивы? Где хранится длина и как получить доступ к индексу массива? Как получить доступ к динамическому массиву вложенному в динамический массив? |
| 257 | + |
| 258 | + 7.5 Как хранятся маппинги? Как получить доступ к элементу маппинга? Как получит доступ к маппингу вложенному в маппинг? Как получить доступ к массиву вложенному в маппинг? |
| 259 | + |
| 260 | + 7.6 Как хранятся массива байтов и строки? Какая есть особенность? |
| 261 | + |
| 262 | + 7.7 Какие есть инструкции для работы со storage в Yul? |
| 263 | + |
| 264 | +8. Как устроен тип памяти memory? Для чего используется тип памяти memory? |
| 265 | + |
| 266 | + 8.1 Когда переменные инициализируются в memory и когда очищаются? |
| 267 | + |
| 268 | + 8.2 Какая есть особенность при работе с memory? Можно ли записывать что-то в первые 128 байт? Как они используются Solidity? |
| 269 | + |
| 270 | + 8.3 Как получить указатель на свободное место в memory? |
| 271 | + |
| 272 | + 8.4 Очищается ли memory автоматически при переключении с кода solidity на inline assembly и наоборот? |
| 273 | + |
| 274 | + 8.5 Какие есть инструкции для работы с memory в Yul? |
| 275 | + |
| 276 | + 8.6 Как хранятся структуры в memory? |
| 277 | + |
| 278 | + 8.7 Как хранятся массивы фиксированной длины и динамические массивы? |
| 279 | + |
| 280 | + 8.8 Как хранятся массивы байтов и строки? |
| 281 | + |
| 282 | + 8.9 Как работают инструкции `revert` и `return`? |
| 283 | + |
| 284 | + 8.10 Как работает `keccak256` в memory? |
| 285 | + |
| 286 | +9. Как устроен тип памяти calldata? |
| 287 | + |
| 288 | + 9.1 Для чего используется тип данных calldata? |
| 289 | + |
| 290 | + 9.2 Почему работать с calldata дешевле по газу чем с memory? |
| 291 | + |
| 292 | + 9.3 Какие инструкции в Yul есть для работы с типом данных calldata? |
| 293 | + |
| 294 | + 9.4 Как в calldata хранятся массивы? |
| 295 | + |
| 296 | + 9.5 Как в calldata хрянятся массивы байтов и строки? |
| 297 | + |
| 298 | + 9.6 Как сделать срез данных (array slice), для чего это нужно? |
| 299 | + |
| 300 | +10. Как в Yul выполняется вызов смарт-контрактов? |
| 301 | + |
| 302 | + 10.1 Какие инструкции используются для вызова смарт-контрактов? |
| 303 | + |
| 304 | + 10.2 Как работает инструкция `call(g, a, v, in, insize, out, outsize)`? |
| 305 | + |
| 306 | + 10.3 Как обрабатываются возвращаемые данные? |
| 307 | + |
| 308 | +11. Как работать с событиями в Yul? |
| 309 | + |
| 310 | + 11.1 Рассказать что происходит в функции `foo`: |
| 311 | + |
| 312 | + ```js |
| 313 | + contract EmitEvent { |
| 314 | + event SomeLog(uint256 indexed a, uint256 indexed b, bool c); |
| 315 | + |
| 316 | + function foo() external { |
| 317 | + assembly { |
| 318 | + let signature := 0x39cf0823186c1f89c8975545aebaa16813bfc9511610e72d8cff59da81b23c72 |
| 319 | + |
| 320 | + let ptr := mload(0x40) |
| 321 | + mstore(ptr, 1) |
| 322 | + |
| 323 | + log3(0x80, 0x20, signature, 2, 3) |
| 324 | + } |
| 325 | + } |
| 326 | + } |
| 327 | + ``` |
| 328 | + |
| 329 | +12. Можно ли писать смарт-контракты на чистом Yul? |
| 330 | + |
| 331 | +- [Docs: Yul](https://docs.soliditylang.org/en/latest/yul.html) |
| 332 | +- [Docs: Layout of memory](https://docs.soliditylang.org/en/latest/internals/layout_in_memory.html) |
| 333 | +- [Playlist: Mastering Solidity Assembly (YUL)](https://youtube.com/playlist?list=PL5hld-skrdFrxGUmmEbG1LBvYVyTE9M62&si=jwXH_rtSvoNfrDPg) |
| 334 | +- [Article: Inline Assembly in Solidity: A Practical Starter’s Guide](https://medium.com/lumos-labs/inline-assembly-in-solidity-34d3ba2cfa7a) |
| 335 | +- [Video: The Dark Arts of Yul](https://www.youtube.com/watch?v=ew3pfnb2_V8) |
0 commit comments