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

За последнее время на канал пришло много новеньких, поэтому, думаю, стоит сделать пару постов на тему старта своей карьеры в web3 и ответить на некоторые популярные вопросы. Участников с опытом попрошу оставлять свои комментарии к постам, если вдруг будет, что добавить. Итак, поехали.

1. Какие профессии есть в web3?

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

- Разработчик смарт контрактов;
- Разработчик смарт контрактов + фронтэнд;
- Аудитор смарт контрактов;
- Блокчейн разработчик;
- Архитектор систем (для DAO, gameFi, DeFi);
- Экономист (токеномика);
- Комьюнити менеджер;
- Маркетолог;

На данном канале можно найти кучу полезной информации по первым трем темам. 4-6 темы узкоспециализированные, там нужно изначально понимать требования под вакансии и изучать материал прицельно. Последние две темы для людей, которые не хотят изучать разработку, но планируют перейти в web3. Варианты всегда есть.

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

2. Сколько платят разработчику?

Средняя з/п около 3к-4к долларов в месяц. Более опытные программисты могут получать и 8-10, а сеньоры и того больше.

3. Сложно ли найти работу?

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

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

4. Что нужно для поиска работы?

В идеале - портфолио на GitHub. Это могут быть как мелкие одностраничные проекты в web3, так и более крупные - своя игра, приложение обменник, dao и т.д. Главное показать, что вы можете писать сложные смарт контракты. Также будут огромным плюсом ваши статьи или посты по теме разработки. Страничка на LinkedIn, активный профиль в Твиттере или ваш персональный сайт тоже будут кстати.

Далее поговорим о навыках.

#start #web3 #newby
👍121🔥1
Как стать web3 разработчиком? Часть 2

5. Сколько уйдет времени на обучение?

Прежде всего не стоит верить, что разработчика из вас сделают курсы или гайды по типу: "В web3 за 30 дней". Это все полная чушь!

Да, например, сам язык Solidity или JS можно выучить за пару недель. Но вот научиться с ним обращаться...

Если у вас есть еще постоянная работа и на обучение вы будете готовы тратить пару часов в день, то закладывайте НЕ МЕНЕЕ полугода-года! Лично у меня уже были хорошие знания в php и js, когда я начал изучать Solidity. И вот стартовал я в начале прошлого года, а активно стал "задрачивать" с июля, когда и открыл этот канал. В день у меня уходило около 6-8 часов на уроки. И только сейчас я приступил к конкурсным аудитам.

Web3 разработчик - ЭТО ПОСТОЯННОЕ ОБУЧЕНИЕ ИЗО ДНЯ В ДЕНЬ! Тут вы никогда не сможете сказать, например, я уже все изучил и стал профи. Индустрия очень быстро развивается и нужно следовать технологиям, чтобы оставаться востребованным специалистом.

6. Какие знания потребуются, если начинать с полного нуля?

Смотрите, web3 разработчик, в основном, специализируется на написании смарт контрактов, или специальных программ для сетей блокчейна. Можно выделить два основных языка, которые встречаются в вакансиях: Solidity и Rust.

Хоть Rust и прекрасный язык, на котором написан блокчейн Solana и смарт контракты на нем, все же я считаю Solidity чуть более востребованным и перспективным, поэтому этот канал и посвящен ему.

Итак, на Solidity мы будем учиться писать смарт контракты, или программы для блокчейна Эфира. Из-за особенностей работы таких СК, нам потребуются сепциальные программы для их тестирования. И тут на сцену выходят два новых языка: JavaScript и Python.

Разработчики используют специальную среду разработки: это такой набор инструментов, которые облегчают проведение тестов и упрощают взаимодействие с контрактами. И вот для языка JavaScript это HardHat, для Python - Brownie. Но не огорчайтесь, для Solidity создали свою среду разработки - Foundry.

Именно поэтому, если вы захотите стать только разработчиками смарт контрактов, то Solidity будет вполне достаточно. Только таких вакансий пока еще маловато. Многие требуют навыков работы с фронтэндом, т.е. подключения смарт контрактов к web страничке.

Для этих целей чаще всего используют библиотеки написанные на JavaScript под названием ethers.js и  web3.js.

Более того, чтобы написать простейшую веб страничку, потребуются знания базовых языков HTML и CSS. И вот, что у нас получается:

Простой разработчик => достаточно знаний Solidity (шансы найти работу - низкие),
Разработчик умелый => знания Solidity и Foundry (или Hardhat с JS, или Brownie с Pyhton), шансы - средние,
Фулстек разработчик => Solidity, JS, HTML, CSS, Hardhat, Foundry, ethers.js (web3.js), а также знания популярных сервисов и бирж (Chainlink, Uniswap и т.д.) + портфолио, шансы - хорошие.

Для аудитора обязательно знать Solidity и Foundry (или Hardhat), пройти популярные задачи на поиск уязвимостей, да и знать как происходят взломы.       

Далее об источниках.   

#start #web3 #newby
👍9🔥1
Как стать web3 разработчиком? Часть 3

7. С чего начинать обучение?

С изучения английского языка. Как бы это не звучало, но большинство актуальной информации идет из источников на английском. Даже если вы хорошо будете владеть Solidity, то все равно для подключения к популярным сервисам нам нужно будет проводить массу времени, копаясь в документации.

О курсах.

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

Это только мое мнение, поэтому прошу учитывать это.

С чего же начать свое обучение?

Начните с этих уроков на Ютуб: https://youtube.com/playlist?list=PLWlFXymvoaJ92awHVDO0oSy0z0ZFJifDV  

Илья прекрасно дает информацию и объясняет детали. Вышло уже более 40 уроков. Вы точно сможете понять основы и сделать первые шаги.

Далее можно послушать курс от Сергея:
https://drive.google.com/drive/folders/1LUewuRBOzqP0n2Xok4eMktiAxHStpz8K
https://drive.google.com/drive/folders/1fnISGF6VgCPsBXBPOCDi9KeeD0_ILJza

Достойные знания от хорошего специалиста.

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

Еще порекомендовал бы посмотреть 32 часовой курс от Патрика Коллинса по Solidity с нуля: https://www.youtube.com/watch?v=gyMwXuJrbJQ

После этого, можно учиться дальше на аудитора или фулстек. Во втором случае, я бы крайне рекомендовал научиться JavaScript, чтобы было проще работать с библиотеками ethers.js или web3.js.

Затем, вы можете начинать делать свой первый проект для портфолио. И параллельно проходить популярные  задачки, типа Capture The Ether и Ethernaut, чтобы понимать проблемы в коде и понять насколько он уязвим.

А теперь вспомните все рекламки курсов "за 30 дней". Только на осознанный просмотр всех роликов на Ютуб у вас уйдет месяца два. МИНИМУМ ПОЛГОДА!

8. Как учиться?

У всех свои методы обучения, но я предложу свой.

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

Можете даже поступить как я: открыть свой Телеграм канал и писать уроки-объяснения, так вы еще лучше поймете пройдённую тему.

9. Когда и где искать работу? 

Работу можно начинать тогда, когда вы сможете сами, без подсказок урока, написать свои контракты: токена, NFT, DAO с популярными паттернами, проводить для них тесты, а также уметь подключать популярные сервисы, типа Chainlink.

Не забывайте про портфолио! Это очень важно в web3.

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

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

#start #web3 #newby
👍103
Как стать web3 разработчиком? Часть 4

10. Про что данный канал?

Изначально тут я выкладывал уроки, которые проходил сам. Это были ролики с Ютуб, доки с популярных сервисов и т.д. Где-то с середины ноября я решил выбрать направление аудита смарт контрактов, и тематика канала устремилось в это русло.

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

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

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

11. Всего очень много! Ну это все нафиг!

Я прекрасно понимаю новичков в web3. Если бы я в июле знал, что придется уделять всему этому столько времени, я бы, скорее всего, так и не начал. Информации так много, что усвоить ее с первого раза будет сложно. Одно могу сказать с уверенность: Я рад, что занимаюсь этим и нисколько не жалею о потраченном времени на обучение. Это стоит того на все 100%! Вне всяких сомнений!

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

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

Удачи вам в обучении!

#start #web3 #newby
🥰11👍4👏2
Читаем отчеты вместе. 4

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

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

Сегодня, и на все выходные, предлагаю вам очередной отчет от code4rena. Он немного меньше, чем предыдущий, но тоже интересный.

Приятного изучения!

#report #audit
1
День задач на канале!

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

Эта задача была помечена как Medium Risk, хотя и очень простая. Сможете понять, в чем тут дело?

Решение

Return используется не правильно. В этом случае будет удаляться только первый Dex. Вместо return следует использовать break.

#task
👍3
Задача с assembly

Еще одна задача Medium risk, но на этот раз с использованием assembly. Все же умеют читать его?

Решение

selfbalance() равно address(this).balance. Другими словами, в данном случае пользователь сможет вернуть не только свой остаток после переводов (называют это dust), но и весь баланс контракта опустошить! 

#task
Задача на внимательность

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

Решение

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

#task
1
Посложнее?

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

Решение

Модификатор не защищает от reentrancy. При использовании токенов, написанных не на стандарте ERC20, а, например, ERC777, хакер может повторно заходить в функцию несколько раз и минтить токены сверх меры.

Вот
тут можно почитать описание этого бага.

#task
👍3
Или, может, подлиннее?

Эта задача на знание особенностей Solidity и EVM. Вообще, проблема отсюда часто встречается в базовых описаниях уязвимостей смарт контрактов, и была даже в одной из задач Ethernaut! Поняли, где тут проблема?

Решение

А проблема в том, чот каждый майнер имеет доступ к переменной index. Другими словами, генерацией случайного числа тут можно управлять благодаря block.difficulty и block.timestamp.

Больше информации можно
получить тут.

#task
И последняя на вечер

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

Решение

Во-первых, нет проверки на вводимый адрес to. В-вторых, админ может пересылать деньги от имени другого пользователя. В-третьих, с _data админ может делать исполнение функций в контрактах других пользователей, если таковые имеются. Ну, и самое главное, что я не увидел, это банальное отсутствие payable в to. Другими словами, функция всегда будет откатываться, если msg.value > 0.

Будьте внимательны со своим кодом!

#task
👍2
Конкурс на аудит сети Optimism

Только что узнал, что на площадке Sherlock стартовал конкурсный аудит блокчейн сети L2 - Optimism!

И это действительно круто! Да, были классные проекты DeFi, gameFi, биржи и т.д, но они все работали как часть какой-нибудь сети! А тут такое!

Понятное дело, уязвимости там смогут найти, скорее всего, только очень опытные аудиторы (типа Trust, если знаете такого), но все же, я предлагаю и вам попробовать поучаствовать в конкурсе на хардкоре!

Во-первых, это отличная практика работы с крупными проектами. Куча документации для изучения!

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

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

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

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

Конкурс продлится до 6 февраля. Можно даже отдельный чатик создать для обмена идеями и вопросами. Что скажете?

#optimism #contest
🔥1
Читаем отчеты вместе. 5

Продолжаем повышать свои знания через прочтение аудиторских  отчетов.

Сегодня на очереди отчет с проекта Sherlock. Там было обнаружено 7 High Risk, 10 Medium Risk, 14 Low risk проблем.

Сам отчет довольно большой, поэтому читать можно в несколько этапов. Не подгоняйте себя, если что-то не понятно. Читайте внимательно.

Приступаем к изучению!

#report #audit
Экономим газ дважды

Часто в отчетах, в разделе по экономии газа, я встречал, что вместо модификаторов можно использовать функции, а вместо текстовых ошибок, как мы пишем в require(1>2, "Ohh no!") лучше использовать кастомные ошибки.

Поэтому вместо

modifier onlyOwner() {
require(msg.sender == owner, "Not an owner");
}

можно использовать:

function _onlyOwner() internal {
if(msg.sender != owner) revert Error();
}

что позволит вам дважды, хоть и немного, но сэкономить газ.

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

#gas
👍5
Новинка в Solidity 0.8.18

Встретил в Твиттере интересный пост о том, что в Solidity новой версии 0.8.18 появятся операторы (sub, mul, gt, etc.), которые определяются пользователем. Другими словами, разработчики смогут оператор "деления" переписать на функцию "умножения" и т.д. И это сlеkает работу аудитор сложнее, так как:

1) Теперь нужно будет изучать наследования переопределения в контрактах, чтобы разработчики сами не путались в своих расчетах, или ловить "плохих парней", которые хотят обмануть других пользователей;

2) Также теперь такие переопределения не всегда будут pure / view, и смогут выполнять внешние вызовы, что чревато новыми уязвимостями;

В общем, новая версия принесет новые уязвимости. Работы у аудиторов меньше не станет.

Больше можно почитать тут.

#solidity
👍5🔥1
Чуть больше о Yul (assembly)

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

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

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

Очень длинная, но хорошо объясняющая базовые опкоды.

Оставлю ее здесь на самостоятельное изучение. А если захотите, сможем сделать день yul и разобрать статью по частям.

#yul #assembly #opcode
👍6
Читаем отчеты вместе. 6

Сегодня на очереди отчет от прекрасного аудитора и одного из наблюдателей Sherlock - Trust. В конце прошлого года он занимал лидирующие позиции на популярных платформах и заслужил доверие многих компаний.

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

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

Итак, читаем отчет вместе!

#report #audit
👍2
Как читать calldata?

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

Автор, DeGatchi, прекрасно рассказывает и показывает на примерах, как правильно читать, да и вообще, из чего состоит calldata.

Предлагаю и вам прочитать данную статью.

Вкратце говоря, автор показывает, что calldata состоит из набора строк по 32 байта и разбивает несколько примеров построчно. Более того, он разбирает несколько вариантов calldata: со статическими переменными, с динамическими и смешанными, а также multicall.

Очень много примеров и скринов. Классная статья!

#calldata
👍4
Правило 1/64

До введения стандарта EIP-150, вызывающий (caller) из одного контракта передавал вызываемому (callee) в другой контракт весь свой имеющийся газ.

Тогда, для того, чтобы предотвратить ошибку "stack too deep", максимальное количество вызовов (calls) могло быть не больше 1024, после чего последний вызов обрывался (возвращал fail).

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

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

Правило 1/64 означает, что при любых обстоятельствах у вызывающего останется 1/64 часть от всего доступного газа.

Другой особенность EIP-150 было то, что опкод call теперь имел не фиксированное количество газа, а максимально возможное. При этом, если операция требовала больше газа, чем было возможно по формуле, то транзакция все равно не откатывалась.

Перевод подготовлен на основе ветки Твиттера.

#gas #eip150
👍21
Скрин к предыдущему посту
👍1
Read-only-reentrancy

Я уже писал ранее о новой уязвимости, которая может получить распространение в этом году. Она основана на том, что даже если функция выполняющая внешний вызов защищена от reentrancy модификатором, библиотекой или как-то еще, но есть другая view / pure функция, которая используется ней, производя какие-то расчеты, например, по выплатам rewards, то все равно сохраняется возможность взлома.

Теперь аудиторы должны научиться распознавать подобные штуки в контрактах.

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

Обязательно к прочтению для всех аудиторов!

#security #reentracy
👍3🤔1