Skip to content

Commit 5ddccab

Browse files
rlkvrvPavelNaydanov
authored andcommitted
feat: yul questions
1 parent 2b00cec commit 5ddccab

File tree

1 file changed

+118
-1
lines changed

1 file changed

+118
-1
lines changed

solidity/junior-3/solidity/README.md

Lines changed: 118 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,4 +215,121 @@
215215
- [Видео: как работают отрицательные числа](https://www.youtube.com/watch?v=BIYiuy8WWiU)
216216
- [Bitwise operation](https://en.wikipedia.org/wiki/Bitwise_operation)
217217
- [Видео: как работать с битами](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

Comments
 (0)