Skip to content

Commit 5c54da9

Browse files
committed
feat: new theory qestions
1 parent e9d8692 commit 5c54da9

File tree

2 files changed

+119
-16
lines changed

2 files changed

+119
-16
lines changed

junior-1/solidity/README.md

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@
6969
## Типы. Reference types
7070

7171
1. Что можешь рассказать про reference types?
72-
- Data location(storage, memory, calldata)
73-
- Массивы(динамические и с фиксированной длиной)
72+
- Data location (storage, memory, calldata)
73+
- Массивы (динамические и с фиксированной длиной)
7474
- Структуры
7575
2. Как получить длину массива?
7676
3. Как добавлять данные в массив?
@@ -150,6 +150,8 @@ contract C {
150150
3. Зачем нужны специальные функции fallback и receive?
151151
- Что будет если отправить в контракт эфир где нет fallback/receive?
152152
4. Как работает перегрузка функций?
153+
5. Что такое "free functions" или другое название функции за пределами контракта? В чем их особенность?
154+
- Может ли такая функция посылать ether, вызывать другие контракты, получить доступ к `this`, переменной из storage?
153155

154156
## Наследование
155157

@@ -173,3 +175,69 @@ contract C {
173175
1. Что такое библиотека?
174176
2. Как подключить библиотеку?
175177
- Что такое using for?
178+
179+
180+
## Интересные вопросы
181+
182+
1. Округление при делении.
183+
- Какой ожидается результат вызова функции `roundingDivision()`? В чем заключается проблема? Как это можно обойти?
184+
```solidity
185+
function roundingDivision() external pure returns (uint256) {
186+
return uint256(7) / uint256(5);
187+
}
188+
```
189+
- Какой ожидается результат вызова функции `divisionByZero()`?
190+
```solidity
191+
function divisionByZero() external pure returns (uint256) {
192+
return uint256(7) / 0;
193+
}
194+
```
195+
2. Что произойдет при вызове функции `setOwner(addressB, anyAccount)` на контракте A? Чему будет равен вызов функций `manager()` и `owner()`? Почему важен порядок переменных в этих двух контрактах?
196+
```solidity
197+
contract A {
198+
address public manager;
199+
address public owner;
200+
201+
function setOwner(address target, address account) external {
202+
(bool success,) = target.delegatecall(
203+
abi.encodeWithSignature("setOwner(address)", account)
204+
);
205+
206+
if (!success) {
207+
revert();
208+
}
209+
}
210+
}
211+
212+
contract B {
213+
address public owner;
214+
address public manager;
215+
216+
function setOwner(address account) external {
217+
owner = account;
218+
}
219+
}
220+
```
221+
3. Работа модификаторов. Что вернут переменные `stateA`, `stateB`, `stateC` после вызова функции changeStates()?
222+
```solidity
223+
contract Modifier {
224+
uint256 public stateA;
225+
uint256 public stateB;
226+
uint256 public stateC;
227+
228+
modifier changeStateA() {
229+
stateA++;
230+
_;
231+
}
232+
233+
modifier changeStateB() {
234+
_;
235+
stateB++;
236+
_;
237+
}
238+
239+
function changeStates() external changeStateA changeStateB {
240+
stateC++;
241+
}
242+
}
243+
```

junior-2/solidity/README.md

Lines changed: 49 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,34 @@
77
- Какой тип блока catch используется для ```revert("reasonString")```?
88
- Какой тип блока catch используется, если ошибка была вызвана делением на ноль?
99
- Какие типы блока catch используется, если ошибка не подходит под два предыдущих случая, но ошибку необходимо обработать?
10-
3. Чем отличается try / catch от других вариантов обработки ошибок(require, assert, revert)?
10+
3. Чем отличается try / catch от других вариантов обработки ошибок (require, assert, revert)?
1111
4. Может ли вызов функции через call заменить конструкцию try / catch?
12+
5. Можно ли обработать внутреннюю ошибку внутри смарт-контракта при помощи try / catch или это только для внешних вызовов?
13+
- Какой из из вызовов `revert` действительно отменит транзакцию?
14+
```solidity
15+
contract B {
16+
function callMe() external {
17+
require(false);
18+
}
19+
}
20+
21+
contract A {
22+
function callMe(B b) external {
23+
try b.callMe() {
24+
revert();
25+
} catch Panic(uint256 errorCode) {
26+
revert();
27+
} catch Error(string memory reason) {
28+
revert();
29+
} catch (bytes memory lowLevelData) {
30+
revert();
31+
}
32+
}
33+
}
34+
```
1235
1336
- [Solidity docs](https://docs.soliditylang.org/en/v0.8.19/control-structures.html#try-catch)
37+
- [Try Catch and all the ways Solidity can revert](https://www.rareskills.io/post/try-catch-solidity)
1438
1539
## Unchecked Math
1640
@@ -25,7 +49,7 @@
2549
pragma solidity 0.8.0;
2650
2751
contract Counter {
28-
uint8 _counter= 255;
52+
uint8 _counter = 255;
2953
3054
function increase() public payable {
3155
_counter++;
@@ -42,10 +66,12 @@ contract Counter {
4266
pragma solidity 0.8.0;
4367
4468
contract Counter {
45-
uint8 _counter= 255;
69+
uint8 _counter = 255;
4670
4771
function increase() public payable {
48-
unchecked {_counter++;}
72+
unchecked {
73+
_counter++;
74+
}
4975
}
5076
5177
function getCounter() external view returns(uint8) {
@@ -56,16 +82,18 @@ contract Counter {
5682

5783
```solidity
5884
// SPDX-License-Identifier: MIT
59-
pragma solidity 0.7.0;
85+
pragma solidity 0.8.0;
6086
6187
contract Counter {
62-
uint8 _counter= 255;
88+
int8 _counter= -128;
6389
64-
function increase() public payable {
65-
_counter++;
90+
function decrease() public payable {
91+
unchecked {
92+
_counter--;
93+
}
6694
}
6795
68-
function getCounter() external view returns(uint8) {
96+
function getCounter() external view returns(int8) {
6997
return _counter;
7098
}
7199
}
@@ -76,13 +104,19 @@ contract Counter {
76104
pragma solidity 0.8.0;
77105
78106
contract Counter {
79-
int8 _counter= -128;
107+
uint8 _counter = 255;
80108
81-
function decrease() public payable {
82-
unchecked {_counter--;}
109+
function increase() public payable {
110+
unchecked {
111+
_increase();
112+
}
83113
}
84114
85-
function getCounter() external view returns(int8) {
115+
function _increase() private {
116+
_counter++;
117+
}
118+
119+
function getCounter() external view returns(uint8) {
86120
return _counter;
87121
}
88122
}
@@ -268,7 +302,7 @@ contract Counter {
268302

269303
1. Какие есть два возможных способа создания контрактов?
270304
2. Как создать контракт через new? Что на самом деле внутри происходит при создании таким способом?
271-
3. Для чего нужен constructor? Сколько раз он вызывается? Можно ли делать перегрузку для constructor?
305+
3. Для чего нужен constructor? Сколько раз он вызывается? Можно ли делать перегрузку для constructor? Является ли constructor частью байт-кода контракта?
272306
4. Как передать эфир при создании контракта?
273307
5. Как создать контракт через create? Как создать контракт через create2? Какие различия между create и create2? Как у них происходит образование адреса контракта? Почему не безопасно создавать через create?
274308
6. Можно ли каким-то образом передеплоить смарт-контракт на тот же адрес но с другим кодом?
@@ -278,6 +312,7 @@ contract Counter {
278312
- [EVM Dialect](https://docs.soliditylang.org/en/v0.8.18/yul.html#evm-dialect)
279313
- [About create and create2](https://mixbytes.io/blog/pitfalls-of-using-cteate-cteate2-and-extcodesize-opcodes)
280314
- [Factory patterns](https://blog.logrocket.com/cloning-solidity-smart-contracts-factory-pattern/)
315+
- [Ethereum smart contract creation code](https://www.rareskills.io/post/ethereum-contract-creation-code)
281316

282317
## Keccak256
283318

0 commit comments

Comments
 (0)