- Что такое try / catch? Как эта конструкция используется в языке Solidity? Какие могут быть причины ошибки вызова функции смарт-контракта?
- Какие типы блоков Catch поддерживаются в Solidity?
- Какой тип блока catch используется для
revert("reasonString")? - Какой тип блока catch используется, если ошибка была вызвана делением на ноль?
- Какие типы блока catch используется, если ошибка не подходит под два предыдущих случая, но ошибку необходимо обработать?
- Какой тип блока catch используется для
- Чем отличается try / catch от других вариантов обработки ошибок(require, assert, revert)?
- Может ли вызов функции через call заменить конструкцию try / catch?
-
Что такое overflow/underflow в solidity?
-
Для чего используется библиотека Safe Math от OpenZeppelin? Нужно ли в версии solidity выше 0.8 использовать библиотеку Safe Math?
-
Для чего в solidity существует unchecked?
-
Расскажи, что вернет функция
getCounter(), после вызова функцииincrease()илиdecrease()в каждой реализации контрактаCounter.
// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;
contract Counter {
uint8 _counter= 255;
function increase() public payable {
_counter++;
}
function getCounter() external view returns(uint8) {
return _counter;
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;
contract Counter {
uint8 _counter= 255;
function increase() public payable {
unchecked {_counter++;}
}
function getCounter() external view returns(uint8) {
return _counter;
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.7.0;
contract Counter {
uint8 _counter= 255;
function increase() public payable {
_counter++;
}
function getCounter() external view returns(uint8) {
return _counter;
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;
contract Counter {
int8 _counter= -128;
function decrease() public payable {
unchecked {_counter--;}
}
function getCounter() external view returns(int8) {
return _counter;
}
}- Как можно использовать unchecked для уменьшения затрат газа при работе с циклами?
- Что такое сигнатура функции? Что такое селектор функций и как он создается в Solidity? Какие есть способы получить селектор функции в смарт-контракте? (назвать несколько)
- Как селекторы функций связаны с ABI (Application Binary Interface) в Solidity и какое значение имеет ABI для разработки контрактов?
- Можете ли быть так, что две функции в контракте Solidity могут иметь одинаковое имя, но разные селекторы функций?
- Как можно использовать селекторы функций для оптимизации использования газа в контрактах Solidity?
- Как селекторы функции используются в вычислении
interfaceIdдля интерфейса смарт-контракта?
- Solidity docs
- A technical primer on using encoded function calls
- How To Decipher A Smart Contract Method Call
- Advanced gas optimization tips for Solidity
- ERC-165: Standard Interface Detection
- Кто генерирует ABI? Что из себя представляет ABI?
- Что обозначают поля: type, name, inputs, outputs, stateMutability в ABI?
- Какие типы Solidity не являются частью ABI?
- Как кодируются статические типы?
- Как кодируются динамические типы?
- Как кодируются вызовы функций?
- Как кодируются ошибки?
- Как кодируются события?
- Как кодируются индексированные аргументы?
- Для чего нужна низкоуровневая функция
call, какие аргументы принимает? - Что возвращает функция
call? Как декодировать возвращаемые значения? - Почему метод передачи эфира через
callявляется предпочтительным? - Можно ли указывать лимит газа для транзакции при вызове
call? Если да, то зачем указывать лимит газа и какие могут быть проблемы? - Для чего нужна низкоуровневая функция
staticcall, в чем отличие отcall? - Для чего нужна низкоуровневая функция
delegatecall, в чем отличие отcallиstaticcall? - Какие возможны уязвимости связанные с
delegatecall? - Как все эти функции связаны с
msg.valueиmsg.data? - Как вызвать другой контракт с помощью этих функций? Как вызвать конкретную функцию другого контракта с аргументами?
- По каким причинам низкоуровневый вызов других смарт-контрактов через
callне является предпочтительным? - Приведи несколько примеров, когда без низкоуровневого вызова другого смарт-контракта через
callиdelegatecallне обойтись?
- Solidity docs:
- Solidity docs: Members of Address Types
- Staticcall
- Delegatecall
- Learn Solidity lesson 34. Call, staticcall and delegatecall
- Solidity by example - Call
- SWC-112 - delegatecall
- What is gas limit
- Идея
importоснована на концепции модулей. В чем основная суть этого концепта? - Local vs external. В чем разница?
- Specific import. Как этим пользоваться?
- Нужно ли стремиться использовать specific import за место импорта всего, что есть в файле? Например,
import "./Storage.sol" - Что можно импортировать из файла
Storage.solдля использования в контрактеSpecificImport?
- Нужно ли стремиться использовать specific import за место импорта всего, что есть в файле? Например,
/// SpecificImport.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
import {
// Что можно импортировать из контракта Storage?
} from "./Storage.sol";
contract SpecificImport {} /// Storage.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
address constant OWNER = 0x607B5e673D3ea42A0F85aDD6f529196500FC9E04;
uint256 constant STORAGE_SLOT = 113;
struct StorageList {
address storageContract;
}
interface IStorage {
function getStorageSlot() external view returns (uint256);
function setStorageSlot(uint256 newStorageSlot) external;
}
library Array {
function removeItem(uint256 index) external {}
}
enum STATUS {
ACTIVE,
PAUSED
}
error Storage_SetStorageLimit();
// User-defined value type. More https://docs.soliditylang.org/en/v0.8.13/types.html#user-defined-value-types
type UFixed256x18 is uint256;
contract Storage {
uint256 private _storageSlot = STORAGE_SLOT;
uint256 _maxSetStorageCount;
mapping(address => uint256) _counter;
event StorageSlotUpdated(address sender);
constructor(uint256 maxSetStorageCount) {
_maxSetStorageCount = maxSetStorageCount;
}
function getStorageSlot() external view returns (uint256) {
return _storageSlot;
}
function setStorageSlot(uint256 newStorageSlot) external {
if (_counter[msg.sender] >= _maxSetStorageCount) {
revert Storage_SetStorageLimit();
}
_storageSlot = newStorageSlot;
_counter[msg.sender] += _counter[msg.sender];
emit StorageSlotUpdated(msg.sender);
}
}
function createStorage(uint256 maxSetStorageCount) returns (address) {
Storage storageImpl = new Storage(maxSetStorageCount);
return address(storageImpl);
}
- Import Aliases. Ключевое слово as. Для чего это нужно?
- Общие вопросы по библиотекам?
- Можно ли отправить эфир библиотеке?
- Есть ли в библиотеке переменные состояния?
- Могут ли библиотеки содержать в себе
receive(),callback()илиpayableфункции? - Могут ли библиотеки быть уничтожены через вызов
selfdestruct()? - Можно ли наследовать библиотеку и быть унаследованным?
- Почему использование библиотеки дешевле, чем наследование контрактов?
- Какие из перечисленных типов данных можно реализовать в библиотеке?
- struct
- enum
- интерфейс
- любую публичную переменную
uint256 public myVar = 100; - константу
uint256 constant MY_CONSTANT = 100; - модификатор
- Какие есть варианты развертывания библиотеки? В чем разница между этими вариантами?
- Можно ли объявлять в библиотеках функции без имплементации, как в интерфейсах?
function onConnect() public pure returns (bool);- Можно ли использовать
Eventв библиотеках? Могут ли возникнуть какие-то сложности в связи с этим? - Можно ли использовать модификаторы внутри библиотеки? Какие есть особенности с этим связанные?
- Какие есть два возможных способа создания контрактов?
- Как создать контракт через new? Что на самом деле внутри происходит при создании таким способом?
- Для чего нужен constructor? Сколько раз он вызывается? Можно ли делать перегрузку для constructor?
- Как передать эфир при создании контракта?
- Как создать контракт через create? Как создать контракт через create2? Какие различия между create и create2? Как у них происходит образование адреса контракта? Почему не безопасно создавать через create?
- Можно ли каким-то образом передеплоить смарт-контракт на тот же адрес но с другим кодом?
- Что такое Factory pattern в solidity? Какие есть типы? какие преимущества их использования? Когда необходимо их использовать?
- Что такое хеш-функции? Для чего они нужны?
- Почему в solidity используется функция
keccak256? - Как эта функция используется на уровне языка Solidity?
- В каких случаях может понадобиться хешировать данные на смарт-контракте? Как это сделать?
- Есть ли различия между хешированием и шифрованием?
-
Что такое commitment scheme (можно встретить название commit-reveal scheme)? Какие этапы в себя включает?
-
Для каких случаев необходимо применять commitment scheme? Привести не меньше трех use cases.
-
Какую роль играет хеширование и алгоритм
keccak256в commitment scheme? -
Задача: реализовать простой смарт-контракт, демонстрирующий работу commitment scheme.
Игра "данетка". Первый игрок загадывает строку, фиксирует загаданное на блокчейне (для этого необходимо вызвать функцию
commit()). Затем второй игрок угадывает строку по наводящим вопросам, при этом первый игрок может отвечать да или нет. В конце игры, первый игрок раскрывает строку, которая была загадана (для этого необходимо вызвать функциюreveal()), чтобы доказать, что загаданное было отгадано (или не отгадано).contract YesOrNo { function commit(bytes32 hash) external { // TODO: реализовать сохранение загаданного слова или фразы } function reveal(string memory value) external returns (string memory) { // TODO: реализовать раскрытие сохраненной строки } }
- Что такое цифровая подпись? Для чего используется подпись?
- В чем разница между подписью транзакции и подписью произвольного сообщения?
- Что такое ECDSA в общих чертах(глубокое математическое понимание не нужно)?
- Что понимается под обозначением {r, s, v}? Как называется и что решает {v}?
- В кошельках подпись часто используется в следующем виде:
0x0f1928d8f26b2d9260929425bdc6ac922f7d787fd73b42afe2548776a0e858016f52826d8ab67e1c84e6e6778fa4769d8aa4f014bf76b3280be77e4e0c447f9b1cКак из этого получить {r, s, v}? - Что можно рассказать про следующие стандарты по работе с подписями?
- Personal_sign. Как гарантируется, что эта подпись может быть использована только в Ethereum сети?
- EIP-191: Signed Data Standard. Для чего используется 0x19?
- EIP-712: Ethereum typed structured data hashing and signing. Что решает Domain? Что решает hashStruct?
- Как на контракте проверить подпись?
- Что такое
ecrecover()? - Что предлагает библиотека OpenZeppelin?
- Что такое
- Приведи три примера того, как можно использовать цифровую подпись.
- Digital signatures
- The Magic of Digital Signatures on Ethereum
- Intro to Cryptography and Signatures in Ethereum
- Математические и криптографические функции
- EIP-191
- Testing EIP-712 Signatures
- Что такое обновляемые контракты? Для чего это нужно?
- Можно ли мигрировать данные с одного смарт-контракта на другой?
- Как это сделать?
- Что мешает это сделать или в чем основная сложность?
- Может ли помочь в обновление кода контрактов разделение хранения данных и логики реализации по разным контрактам?
- Можно ли применять поведенческие шаблоны проектирования для разделения хранения данных и логики? Как применить шаблон Strategy?
- Можно ли при использование паттерна Strategy обновить главный контракт логики?
- Как применить шаблон проектирования Proxy для обновления контрактов?
- Как работает прокси для смарт-контрактов? В чем основной концепт? Как в этом концепте участвует функция
delegateCall()? - Что такое конфликт селекторов функций?
- Для чего нужен стандарт ERC-1967: Proxy Storage Slots?
- Что можно рассказать про Transparent proxy? Как он устроен? Для чего предназначался?
- Что такое UUPS? В чем его отличие от Transparent?
- Для чего был придуман Beacon Proxy?
- Что такое EIP-1167? Для чего библиотека Clones от OpenZeppelin? Можно ли обновлять прокси, созданные при помощи этой библиотеки?
- Как работает прокси для смарт-контрактов? В чем основной концепт? Как в этом концепте участвует функция
- В чем основная идея Diamond Proxy? Для каких случаев предназначался этот подход?
- В чем отличие Inherited storage VS Diamond Storage VS App Storage?
- В чем плюсы и минусы использования обновляемых контрактов?