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

Сегодня еще один день для наверстывания материала и вникания в последние три видео, которые были на канале. Тем, кто раньше никогда не сталкивался с node.js, npm и терминалом, стоит уделить несколько дней, чтобы разобраться в основах. Как я говорил ранее, их мы будем использовать довольно часто.

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

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

Когда я изучал английский, то старался проговаривать диалоги и фразы на этом языке, не задумываясь о переводе. В том смысле, что не "придумать диалог на русском, а потом в уме перевести его на английский", а сразу составлять его на иностранном языке.

Так и в Solidity. По своей сути весть язык построен на правилах для проведения транзакций и других действий, и базой служат "zero trust" функции. Zero trust - это "нулевое доверие".

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

При этом "фантазируйте", что все и вся хотят вас кинуть или подставить, забрать все деньги. Поэтому никому нельзя доверять и писать проверки буквально на все!

Например, в случае перевода можно проверить:

- Может ли деньги отправлять только владелец кошелька;
- Кто может получить деньги: кошелек или смарт-контракт;
- Что будет если транзакция откатится;
- Что будет, если кто-то захочет взломать эту функцию;
- Нужно ли ее выполнить при каких-то других действиях;

После этого у вас смогут сформироваться действующие лица - они же переменные (владелец, получатель, количество денег, сроки).

В общем, в итоге у меня это работает как-то так.

А как вы учите язык? Есть ли свои лайфхаки? Может вы ведете свою страничку в Notion, куда записываете функции или вопросы по урокам?
👍2🔥1
Урок 8

Новая неделя, а значит и новые уроки!

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

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

Урок сегодня достаточно сложный, особенно для новичков, особенно для тех, кто не посмотрел предыдущие видео по node.js, npm и cmd, поэтому на него мы выделим два дня.

Видео урок для изучения.

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

Если же вас хватит и на тесты контрактов, сможете понять и разобраться, то это будет просто невероятно здорово!

Я же, как обычно, буду делать заметки на канале, на что нужно обратить внимание!

Всем хорошей недели и легкого обучения!

#урок
🔥1
Установка пакетов и подготовка рабочей среды. Часть 1.

Фух, одна из частей обучения, которая заняла у меня кучу времени.

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

Но теперь обо всем оп порядку вместе с вами!

Что такое hardhat?

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

Hardhat - это такая программа для работы со смарт-контрактами, которая позволяет собирать (компилировать) и тестировать их.

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

Hardhat позволяет разворачивать тестовый блокчейн на вашем личном компьютере. Он не такой сложный как, скажем, блокчейн Эфира, но вполне настоящий и годный для контрактов.

Более того, hardhat позволяет разворачивать контракты в тестовых блокчейнах, типа Rinkeby, о котором мы поговорим намного позже.

Также в hardhat устанавливаются дополнительные библиотеки и плагины, которые позволяют проще и гибче взаимодействовать с тестирование контрактов: ethers.js, chai, mocha (произносится как Мокка), waffle.

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

И вот вся эта вакханалия с hardhat, плагинами, библиотеками и пакетами, созданная для разработки и тестирования смарт-контрактов и называется "Средой разработки".

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

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

Я сам планирую обучиться работе с truffle, но уже после всей запланированной программы с Solidity.

#средаразработки
👍1🔥1
Установка пакетов и подготовка рабочей среды. Часть 2.

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

Итак, chai, mocha, waffle - это дополнительные плагины для разворачивания и тестирования смарт-контрактов. Работа с ними намного проще и быстрее, и каждый из них отвечает за свою область.

Если кто-нибудь сможет дать более подробное и понятное описание каждого из них, я буду только рад.

Ethers.js - это библиотека для взаимодействия контракта с фронтенд часть сервиса. Например, вы написали смарт-контракт и хотите, чтобы пользователи могли взаимодействовать с ним: нажимать кнопки, переводить деньги, одабривать транзакции и т.д.

Вот вы написали смарт-контракт, создали визуал сайта с помощью js (чаще всего слышал про react), и соединяете сайт и контракт с помощью ethers.

Это мы делать тоже будем, но сильно позже.

Если у вас возникли вопросы, то смело задавайте в чат и будем разбираться вместе!

#средаразработки #chai #mocha #waffle
Установка пакетов и подготовка рабочей среды. Часть 3.

Вот мы и подошли к разбору настройки рабочей среды с hardhat.

Постараюсь прописать все пошагово.

1) Создаем папку для дальнейших уроков и практик с Solidity, если вы еще не сделали такую. Так и назовем ее, Solidity.

2) Затем создаем еще одну папку с текущим уроком. Например, "Lesson 8".

3) Далее открываем терминал в этой директории. Для пользователей Windows - вы можете в адресную строку директории кликнуть левой кнопкой мыши и написать там "cmd". После чего откроется терминал уже из этой директории. Там будет что-то вроде: "C:\Users\vlad\solidity\lesson8>"

4) В этой директории, в терминале прописываем "npm init -y". Там должен появится файл с расширением .json

5) Далее в терминале в той же директории прописываем "npm install --save-dev hardhat". Должны будут появиться папка node_modules и еще один .json файл

6) После этого прописываем "npx hardhat". Тут обратите внимание, что мы пишем уже не NPM, а NPX - т.е. обращаемся не к пакетному менеджеру, а запускаем сам hardhat.

7) Выбираем "Create a JavaScript project". Для выбора, просто нажмите Enter. И еще раз Enter, чтобы подтвердить директорию. И напишите "n" далее. На данном этапе нам gitignore не потребуется.

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

8) После этого, если обратите внимание на сообщение в терминале выше, появится строка "You need to install...". И вот в уроке на видео лектор устанавливает несколько дополнительных пакетов, как раз таки chai, mocha, ethers и waffle. В новом hardhat это все объединено в toolbox, который и предлагают установить.

9) Прописываем в консоли строку, которая появилась выше, начиная с npm. На момент 1 августа 2022 года - это "npm install --save-dev "hardhat@^2.10.1" "@ nomicfoundation/hardhat-toolbox@^1.0.1"

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

10) Также автор в видео рекомендует установить node-gyp. Признаться честно, я так и не понял, что это такое и для чего этот пакет используется. Возможно, кто-то из участников сможет подсказать. Тем не менее, для установки прописываем "npm install -g node-gyp".

Тут у пользователей Windows могут возникнуть проблемы (к слову, у меня все прошло хорошо). Ни у кого другого я не встречал этот пакет для работы с Solidity, поэтому, предполагаю, что он не так уж и нужен, и если тут возникнут проблемы, будем решать вместе в чате.

11) В завершении пропишем в терминале "npm outdated", чтобы узнать нужно ли что-то обновить.

Все! На этом подготовка рабочей среды закончена! Можете выдохнуть, сделать перерыв и кофе! Вы прекрасны!

P.S. Тема сложная! По всем вопросам - пишем в чат!

#средаразработки #hardhat #установка
👍4
Редактор кода

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

Поэтому нам необходимо выбрать новый редактор кода.

Редакторов существует достаточно много, поэтому расскажу про тот, что я использую сам.

Редактор - Visual Studio Code.

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

После установки, осмотритесь внутри и установите плагины для работы с кодом Solidity и терминал, если его не будет.

Да, там есть свой собственный терминал, и мне его использовать горазго проще, чем каждый раз запускать cmd в windows.

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

#visualcode
Доброе утро всем, надеюсь у вас вчера получилось разобраться с подготовкой и настройкой рабочей среды 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, и тд.

Что думаете?