ethereum_smartcontract_intro
https://github.com/dbhim/ethereum_smartcontract_intro
https://gitverse.ru/dbhim/ethereum_smartcontract_intro
Здесь представлено небольшое введение в блокчейн, Ethereum, смарт-контракты, Solidity. Это материалы занятия, которое было проведено для студентов старших курсов по специальности "компьютерная безопасность". Предполагается, что у обучающихся имеются соответствующие знания по программированию, базам данных, криптографии, безопасности, эксплуатации уязвимостей. Исходя из этого отбирался материал для занятия и способ его представления.
Ethereum
Для написания смарт-контрактов можно использовать ассемблер. Но обычно используются высокоуровневые языки: Solidity, Vyper, Yul.
Для разработки, тестирования, разворачивания смарт-контрактов используются фреймворки Brownie (Python), Hardhat (JS), Truffle.
Описание настройки связки hardhat и Remix
Примеры
Я постарался проиллюстрировать примерами основные синтаксические возможности языка Solidity, а также некоторые тонкие места взаимодействия с контрактами. Следует прочитать код примеров с комментариями, повызывать методы контрактов, проанализировать отладочный вывод, сопоставить вывод с исходным кодом.
1_DemoContract.sol
Пример демонстрирует следующие возможности:
- определение контракта;
- наследование контрактов;
- абстрактные контракты;
- библиотеки;
- встроенные типы данных;
- константы времени компиляции (
) и времени исполнения (constant
,constant
);immutable - методы и поля контракта, их модификаторы видимости и константности;
- инициализация полей контракта;
- конструктор контракта;
- перегрузка функций;
- собственные модификаторы функций;
- проверка условий в run-time (
,require
);assert - размещение данных в storage;
- перезапись элементов в storage через переполнение динамического буфера
Для тестирования примера выполнить:
- задеплоить контракт
с нулевым и ненулевым количеством эфира;DemoContract - вызвать
с нулевым и ненулевым аргументом;PureFunction - вызвать
;TestBytes - вызвать
.TestVariables
2_Deposit.sol
Пример реализует простую функциональность по размещению депозитов пользователей с выплатой процентов.
Пример демонстрирует следующие возможности:
- приём монет от пользователей;
- передача монет пользователям;
- выплата процентов в зависимости от прошедшего времени;
- генерация событий.
Для тестирования примера выполнить:
- задеплоить контракт
с 1 эфиром;DepositContract - положить деньги на контракт вызовом функции
с 1 эфиром;deposit - проверить свой баланс вызовом функции
;balanceOf - забрать деньги с контракта вызовом
;withdraw - положить деньги с разных адресов и забрать все деньги вызовом функции
с адреса владельца.destroy
3_Call.sol
Пример иллюстрирует создание в контрактах других контрактов и вызов их функций.
Пример демонстрирует следующие возможности:
- создание контрактов через оператов
;new - вызов функций через переменную с типом контракта;
- низкоуровневый вызов функций адреса;
- интерфейсы;
- создание контрактов инструкциями
,create
.create2
Для тестирования примера выполнить:
- задеплоить контракт
с 10 эфирами;CallContract - вызвать функцию
с аргументом 5000;CreateHello - вызвать функцию
с аргументом 1000;CreateHello - вызвать функцию
с аргументом 100;CreateHello - два раза вызвать функцию
: адресCreateHello2
будет меняться, адресhello1
будет одинаковым;hello2 - вызвать функцию
, в качестве аргумента передать байткод контрактаCreateHello3
(можно сделать деплой контрактаHelloWorld
и скопировать его из транзакции из поля input);HelloWorld - вызвать функцию
, в качестве аргумента передать некоторое число (salt) и байткод контрактаCreateHello4
;HelloWorld - задеплоить контракт
;CallContract2 - вызвать функцию
;CallRevert - вызвать функцию
;StaticcallRevert - вызвать функцию
;StaticcallRevert2 - вызвать функцию
2 раза;DelegatecallRevert - вызвать функцию
с 1 и 2 эфирами;Resend - вызвать функцию
с 1 и 2 эфирами;Retransfer - задеплоить контракт
;CallContract3 - вызвать функцию
с 6 эфирами;ResendNotPayableFunction - вызвать функцию
.DemoFun
Задания
В отдельном репозитории доступны уязвимые контракты, к которым следует написать эксплоиты.