From 5c54da9c2c92595d7e178824ce2279fb4bc5e6c7 Mon Sep 17 00:00:00 2001 From: Pavel Naydanov Date: Thu, 25 Jul 2024 17:10:05 +0700 Subject: [PATCH] feat: new theory qestions --- junior-1/solidity/README.md | 72 +++++++++++++++++++++++++++++++++++-- junior-2/solidity/README.md | 63 ++++++++++++++++++++++++-------- 2 files changed, 119 insertions(+), 16 deletions(-) diff --git a/junior-1/solidity/README.md b/junior-1/solidity/README.md index f0f26ff..a38cb4b 100644 --- a/junior-1/solidity/README.md +++ b/junior-1/solidity/README.md @@ -69,8 +69,8 @@ ## Типы. Reference types 1. Что можешь рассказать про reference types? - - Data location(storage, memory, calldata) - - Массивы(динамические и с фиксированной длиной) + - Data location (storage, memory, calldata) + - Массивы (динамические и с фиксированной длиной) - Структуры 2. Как получить длину массива? 3. Как добавлять данные в массив? @@ -150,6 +150,8 @@ contract C { 3. Зачем нужны специальные функции fallback и receive? - Что будет если отправить в контракт эфир где нет fallback/receive? 4. Как работает перегрузка функций? +5. Что такое "free functions" или другое название функции за пределами контракта? В чем их особенность? + - Может ли такая функция посылать ether, вызывать другие контракты, получить доступ к `this`, переменной из storage? ## Наследование @@ -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++; + } + } + ``` \ No newline at end of file diff --git a/junior-2/solidity/README.md b/junior-2/solidity/README.md index 915f692..4638550 100644 --- a/junior-2/solidity/README.md +++ b/junior-2/solidity/README.md @@ -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 @@ -25,7 +49,7 @@ pragma solidity 0.8.0; contract Counter { - uint8 _counter= 255; + uint8 _counter = 255; function increase() public payable { _counter++; @@ -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) { @@ -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; } } @@ -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; } } @@ -268,7 +302,7 @@ contract Counter { 1. Какие есть два возможных способа создания контрактов? 2. Как создать контракт через new? Что на самом деле внутри происходит при создании таким способом? -3. Для чего нужен constructor? Сколько раз он вызывается? Можно ли делать перегрузку для constructor? +3. Для чего нужен constructor? Сколько раз он вызывается? Можно ли делать перегрузку для constructor? Является ли constructor частью байт-кода контракта? 4. Как передать эфир при создании контракта? 5. Как создать контракт через create? Как создать контракт через create2? Какие различия между create и create2? Как у них происходит образование адреса контракта? Почему не безопасно создавать через create? 6. Можно ли каким-то образом передеплоить смарт-контракт на тот же адрес но с другим кодом? @@ -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