Solidity. Смарт контракты и аудит – Telegram
Solidity. Смарт контракты и аудит
2.62K subscribers
246 photos
7 videos
18 files
547 links
Обучение Solidity. Уроки, аудит, разбор кода и популярных сервисов
Download Telegram
Доброе утро всем, надеюсь у вас вчера получилось разобраться с подготовкой и настройкой рабочей среды hardhat.

Сегодня мы плавно переходим к тестированию смарт-контрактов, которые показаны во второй части вчерашнего урока.

Мне самому поначалу они казались чересчур заумными и запутанными, однако разобрав несколько из них, я понял, что это не сложнее, чем написать смарт-контракт, или даже проще.

Тут не нужно придумывать логику работы с нуля, следить за функциями и чем-то еще. Просто бери, что уже есть и пиши проверку.

После стандартных постов с разбором кода, я сделаю пост, как я сам понимаю работу с hardhat и тестированием смарт-контрактов.

Всем приятного дня и легкого обучения!
👍1
Для начала импортируем библиотеки.

В период обучения мы будем использовать эти две библиотеки чаще всего. При это в других тестах я видел, что используется их большее количество, которые, к сожалению, мне пока не известны.

Тут надо запомнить, что эти библиотеки всегда подключают в самом начале, и нет необходимости писать лицензию или версию Solidity.

#hardhat #test
С помощью describe() мы как бы говорим, что сейчас будем проверять "вот это".

Как я понял, в кавычках можно написать все, что вам угодно. Тем не менее, вам самим будет проще, если тут вы будете писать название функции, которую собираетесь проверить.

#hardhat #describe
Дальше, чтобы начать работу с тестирование контракта, его нужно развернуть в блокчейне.

Делать сразу в mainnet (основную сеть Ethereum) было не только не логично, но и стоило бы денег, поэтому все тесты проводят в тестовых сетях.

Тестовых сетей существует сейчас несколько штук, как например, Ropsten, Rinkeby и Kovan. Но мы в своей работе будем использовать тестовую сеть hardhat.

Его плюс в том, что после каждого теста, он как бы удаляет блокчейн и создает новый, поэтому тесты проводятся независимо друг от друга, что очень хорошо.
Вот этот код, по своей сути, и разворачивает смарт-контракт в тестовой сети hardhat.

Пройдемся по коду:

beforeEach() - говорит о том, что нам нужно переразворачивать смарт-контракт перед каждым тестом, чтобы они были независимы друг от друга.

ethers.getSigners() - в этой функции мы говорим, какие аккаунты, и от каких переменных мы собираемся использовать. Вы же помните, как в Remix мы получали 20 аккаунтов для тестов? Вот и hardhat при разворачивании смарт-контракта выдает нам те же 20 аккаунтов для тестирования.

ethers.getContractFactory() - принимает два значения и указывает на контракт, который мы хотим развернуть, и аккаунт, от имени которого будут проходить тесты. Он же, как бы, и будет владельцем контракта.

deloy() - разворачивание контракта, он же деплой.

deployed() - ожидание выполнения деплоя. Другими словами, мы ждем от hardhat, что контракт был развернут и все прошло хорошо.

#hardhat #deploy
👍1
Давайте разберем первый тест, который приводится в уроке.

Для того, чтобы объявить начало теста мы должны написать функцию it().

В кавычках мы пишем сообщение, которое должны будем получить, в случае успешного прохождения данного теста.

Далее, в теле теста, мы пишем, что хотим проверить. И вот тут нам на помощь приходит Waffle.

С помощью функции expect("адрес").to.be.properAddress мы проверяем, является указанная строка в скобках корректным адресом.

Чтобы запустить тест, вам нужно перейти в терминал и прописать "npx hardhat test".

#hardhat #properAddress #адрес
Если вы проверяете какую-либо сложную функцию, например, оплаты в смарт-контракте, то в тестах сначала нужно воссоздать ее, или вызвать, с указанием необходимых параметров (как "сообщение" и "сумма" в примере).

Чтобы вызвать эту функцию от имени другого аккаунта, то следует присоединить ее к вызову: connect(acc2).

Далее мы видим новую проверку от Waffle - to.changeEtherBalance() - она проверяет изменение в количестве эфира на каком-либо аккаунте (в примере, на втором аккаунте, на сумму в -100).

Можно также проверить изменения в балансе на нескольких аккаунтах с помощью функции changeEtherBalances([],[]), где в первых квадратных скобках указываются аккаунты, а во вторых баланс изменения. В этом случае порядок аккаунтов и балансов очень важен!

#hardhat #connect #changeEtherBalance #changeEtherBalances
Я также обещал написать, как я сам понимаю работу с тестами смарт-контрактов, и почему поначалу она казалась мне немного запутанной.

Когда я смотрел видео, то часто у меня не складывался ход написания кода, когда лектор порой "прыгал" с функции на переменные, а потом к тестам и обратно.

Так вот, все оказалось проще, чем я думал.

1) Сначала объявляем начало теста с it(), и пишем, что мы проверяем.

2) После прописываем async function и начинаем писать тело теста.

3) Думаем, что хотим проверить. Если это функция, то создаем переменную и кладем функцию туда. Т.е. нам нужно сначала вызвать эту функцию в теле теста, а потом уже проверять ее.

4) По своей сути, все проверки - это вызовы каких-либо функций из контракта и сверка их результатов с нашими ожиданиями.

Итак, что же можно тестировать:

1) Правильность написания адреса;
2) Владельца контракта;
3) Функции;
4) Require и error
5) Event и emit
6) Кошельки
7) Деплой контракта
8) Изменения в балансе эфира
9) Изменения в балансе токенов
10) Правильность приватного ключа
11) Правильность hex

Это список тех, что я сам пробовал в уроках и тестах. Вероятно, есть еще большее количество проверок.

#hardhat #test #waffle #тесты
Урок 9

Надеюсь вы смогли разобраться с последним уроком, настроить рабочую среду и хоть немного понять, как писать тесты.

Согласен, эта тема сложная не только для новичков, но и для бывалых разработчиков. Однако понять и зазубрить ее все же стоит.

Могу предположить, что вам требуется еще немного времени на разбор темы, поэтому возьмем пару дней на самообучение, до пятницы.

Сегодня же, хочу показать вам теоретический урок по оптимизации газа в контрактах. Это достаточно легкая тема, которая объясняет как работает газ в транзакциях, и как нужно писать код, чтобы затратить минимум газа.

Видео - оптимизация смарт-контрактов и газ

Погружаться в урок тут не придется, да и посты-подсказки будут служить шпаргалкой в любой момент.

В общем, слушаем и мотаем на ус. Приятного дня и легкого обучения.
Рекомендации по оптимизации газа

Так, вышла некоторая заминка с уроком по газу: я думал, что сделаю несколько скринов и под каждым будет описание рекомендации, но это получается слишком дробно.

Поэтому я решил объединить все рекомендации из урока в одном посте.

Итак, вот список:

1. Не нужно создавать лишние переменные. Особенно те, которые нигде не используются.

2. Если создаете переменную uint, не нужно указывать дефолтное значение "0".

3. Следите за размерностью переменных и порядком их объявления.

4. Если есть заранее известное значение для переменной, то лучше использовать его сразу, а не получать, например, через хеширование.

5. Не создавайте не нужные промежуточные переменные в функциях.

6. Не нужно создавать длинные строки в переменных и функциях.

7. Не следует часто модифицировать переменные состояния, как например в цикле.

8. При возможности лучше использовать mapping, а не array.

9. Если нужно использовать array, то лучше создавать его с фиксированной длиной.

10. Создавайте массивы с правильной размерностью, uint8[] будет стоить дешевле, чем просто uint[].

11. Не рекомендуется создавать много маленьких функций.

12. Используйте библиотеки, а не раздувайте свой код. Open Zeppelin поможет сохранить ваш контракт компактным.

13. Не хранить больше объемы данных в контрактах. Для этого есть облачные хранилища и другие базы данных.

Пока что, это все. Если в других видео я буду встречать еще варианты оптимизации газа, то буду выкладывать их.

#gas #газ #оптимизация
Привет всем!

Ну, как у вас с обучением? Вы хоть маякните, на каком этапе находитесь и все ли понятно.

Сегодня у нас еще один день для самостоятельной практики, и подтягивании знаний по прошлым урокам. Я специально не даю сейчас хардкорные уроки, чтобы вы могли освоиться с текущими знаниями.

Они реально выступят хорошим базисом для дальнейшего обучения, и не поняв что-то сейчас, потом будете путаться еще больше.

На следующей неделе начинаются уже сложные операции со смарт-контрактами, а сама программа с уроками рассчитана еще недели на три.

Легкого запоминания и приятного дня!
Урок 10. Вопросы для собеседования

Признаться честно, я сам продвигаюсь в обучении чуть быстрее, чем выкладываю уроки. Во-первых, так я могу регулировать сложность уроков и подбирать следующий, так чтобы они не создавали кашу в голове, и, во-вторых, чтобы, в случае необходимости, можно было найти дополнительный материал и расписать функции более понятным языком, чем в уроке на видео. Именно поэтому уроки на канале выходят не в том порядке, что уроки на канале youtube у лектора.

Вот и сейчас, вместо того, чтобы выкладывать урок про Древо Меркла, а это один из уроков объясняющих необходимость хешей в Solidity, я предлагаю вам урок попроще, чтобы вы смогли посвятить свое время настройке и практике с hardhat.

Видео - вопросы для собеседования.

Когда я посмотрел этот урок, то подумал, что это идеальное время, чтобы вы могли понять для себя, насколько хорошо прошли предыдущие темы.

Лектор сам задает вопрос и отвечает на них. Практически все вопросы в первой части затрагивают уроки, которые мы уже прошли.

Если по ходу видео, вы сразу будете отвечать на вопросы, не дожидаясь объяснения лектора, то значит, что темы вы усвоили хорошо и полностью готовы двигаться дальше.

Приятного дня и самопроверки!

#урок
Сегодня я хотел бы провести два опроса. И первый, чтобы узнать, как у вас с английским языком. Вопрос обучения, на определённом этапе, будет зависеть именно от этого.

К сожалению, к Solidity еще не так много годной документации нанадо русском. И я хочу узнать, будет ли норм, если позже будут посты на английском языке.

Итак, опрос:
Ну и второй вопрос, как и говорил.

Нужно ли будет через неделю-две попробовать создать скайп-созвон? Можем познакомиться, поотвечать на вопросы по Solidity, и тд.

Что думаете?
Будем планировать онлайн созвон?
Anonymous Poll
73%
Да, хорошая идея
27%
Думаю, пока он не нужен
Урок 11

Я был в дороге последние три дня, потому постов на канале не было совсем. Думал, что успею доехать еще утром в место, где будет связь, но увы.

Тем не менее, по предыдущим опросам я рад, что большинство понимает английскую речь и могут без перевода добирать знания из уроков позже. Для остальных, я попытаюсь делать небольшие выдержки из иностранных уроков, на которые нужно будет обращать внимание.

На этой неделе мы приступаем уже к серьезной работе со смарт-контрактами, и в текущем уроке попробуем разобрать, что такое Наследование в смарт-контрактах.

Видео урок - Наследование.

Этот урок довольно простой, но нужно точно следовать в написании кода за лектором. Так будет намного понятнее.

Я же, как и обычно, но по мере нахождения точек связи, постараюсь выкладывать сюда короткие сниппеты из урока, чтобы можно было быстро находить подсказки в будущем.

Всем приятного просмотра и легких знаний!

#урок #наследование
🔥1
Чтобы создать наследование в контрактах, нужно получить или написать контракт родителя, а затем сослаться на его в дочернем контракте через "is".

Один контракт может наследовать функции из нескольких других. Однако в этом случае важен их порядок определения в дочернем контракте.

Также в наследовании контрактов важно следить за областями видимости функций.

#наследование
🔥1
В некоторых случаях контракты могут становиться Абстрактными. Они не разворачиваются самостоятельно, но при этом могут наследовать или передовать функции в другие контракты.

Чаще всего контракты становятся абстрактными, когда не могут передавать значения в constructor родителя.

Я редко пока что встречал abstract на практике, поэтому буду дополнять инфо по ходу обучения.

#abstract #наследование
🔥1
А вот так можно передавать значения в контруктор родителя, от которого будем получать функции.

#наследование
🔥1
Чтобы переопредилить функцию в дочернем контракте, в родительском контракте необходимо указать параметр virtual, а в первом - override.

#наследование #virtual #override
🔥1