Skip to content
Open

temp #50

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 70 additions & 2 deletions junior-1/solidity/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,8 @@
## Типы. Reference types

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

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

Expand All @@ -173,3 +175,69 @@ contract C {
1. Что такое библиотека?
2. Как подключить библиотеку?
- Что такое using for?


## Интересные вопросы

1. Округление при делении.
- Какой ожидается результат вызова функции `roundingDivision()`? В чем заключается проблема? Как это можно обойти?
```solidity
function roundingDivision() external pure returns (uint256) {
return uint256(7) / uint256(5);
}
```
- Какой ожидается результат вызова функции `divisionByZero()`?
```solidity
function divisionByZero() external pure returns (uint256) {
return uint256(7) / 0;
}
```
2. Что произойдет при вызове функции `setOwner(addressB, anyAccount)` на контракте A? Чему будет равен вызов функций `manager()` и `owner()`? Почему важен порядок переменных в этих двух контрактах?
```solidity
contract A {
address public manager;
address public owner;

function setOwner(address target, address account) external {
(bool success,) = target.delegatecall(
abi.encodeWithSignature("setOwner(address)", account)
);

if (!success) {
revert();
}
}
}

contract B {
address public owner;
address public manager;

function setOwner(address account) external {
owner = account;
}
}
```
3. Работа модификаторов. Что вернут переменные `stateA`, `stateB`, `stateC` после вызова функции changeStates()?
```solidity
contract Modifier {
uint256 public stateA;
uint256 public stateB;
uint256 public stateC;

modifier changeStateA() {
stateA++;
_;
}

modifier changeStateB() {
_;
stateB++;
_;
}

function changeStates() external changeStateA changeStateB {
stateC++;
}
}
```
63 changes: 49 additions & 14 deletions junior-2/solidity/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,34 @@
- Какой тип блока catch используется для ```revert("reasonString")```?
- Какой тип блока catch используется, если ошибка была вызвана делением на ноль?
- Какие типы блока catch используется, если ошибка не подходит под два предыдущих случая, но ошибку необходимо обработать?
3. Чем отличается try / catch от других вариантов обработки ошибок(require, assert, revert)?
3. Чем отличается try / catch от других вариантов обработки ошибок (require, assert, revert)?
4. Может ли вызов функции через call заменить конструкцию try / catch?
5. Можно ли обработать внутреннюю ошибку внутри смарт-контракта при помощи try / catch или это только для внешних вызовов?
- Какой из из вызовов `revert` действительно отменит транзакцию?
```solidity
contract B {
function callMe() external {
require(false);
}
}

contract A {
function callMe(B b) external {
try b.callMe() {
revert();
} catch Panic(uint256 errorCode) {
revert();
} catch Error(string memory reason) {
revert();
} catch (bytes memory lowLevelData) {
revert();
}
}
}
```

- [Solidity docs](https://docs.soliditylang.org/en/v0.8.19/control-structures.html#try-catch)
- [Try Catch and all the ways Solidity can revert](https://www.rareskills.io/post/try-catch-solidity)

## Unchecked Math

Expand All @@ -25,7 +49,7 @@
pragma solidity 0.8.0;

contract Counter {
uint8 _counter= 255;
uint8 _counter = 255;

function increase() public payable {
_counter++;
Expand All @@ -42,10 +66,12 @@ contract Counter {
pragma solidity 0.8.0;

contract Counter {
uint8 _counter= 255;
uint8 _counter = 255;

function increase() public payable {
unchecked {_counter++;}
unchecked {
_counter++;
}
}

function getCounter() external view returns(uint8) {
Expand All @@ -56,16 +82,18 @@ contract Counter {

```solidity
// SPDX-License-Identifier: MIT
pragma solidity 0.7.0;
pragma solidity 0.8.0;

contract Counter {
uint8 _counter= 255;
int8 _counter= -128;

function increase() public payable {
_counter++;
function decrease() public payable {
unchecked {
_counter--;
}
}

function getCounter() external view returns(uint8) {
function getCounter() external view returns(int8) {
return _counter;
}
}
Expand All @@ -76,13 +104,19 @@ contract Counter {
pragma solidity 0.8.0;

contract Counter {
int8 _counter= -128;
uint8 _counter = 255;

function decrease() public payable {
unchecked {_counter--;}
function increase() public payable {
unchecked {
_increase();
}
}

function getCounter() external view returns(int8) {
function _increase() private {
_counter++;
}

function getCounter() external view returns(uint8) {
return _counter;
}
}
Expand Down Expand Up @@ -268,7 +302,7 @@ contract Counter {

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

## Keccak256

Expand Down