Solidity. Смарт контракты и аудит
2.63K subscribers
246 photos
7 videos
18 files
555 links
Обучение Solidity. Уроки, аудит, разбор кода и популярных сервисов
Download Telegram
Как стать 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
Учебная группа от Web3SecurityDao

Вчера появилась информация о том, что Web3SecurityDao запускает учебные группы по вопросам безопасности. Созвоны будут проходить на их Дискорд сервере, начало 1 февраля.

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

В общем, меня заинтересовало, может будет также и вам.

Вот ссылка на информационную страницу и Дискорд.

#study
👍1
Читаем отчеты вместе. 7

Сегодня подумал о том, что есть некая тонкая черта между bug hunter и white hat hacker, баг хантером и белым хакером.

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

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

Позабавило еще то, что в обучении процесс идет как-то так:

1) Сначала мы учимся популярным уязвимостям, читая просто их описание (баг хантер);
2) Затем играемся с CTF и другими задачами (хакер);
3) Идем на популярные конкурсные платформы (баг хантер);
4) Переходим на уровень Immunefi и работы на сетях (хакер);

т.е. идет чередование навыков.  

Но это отступление от темы. А сегодня мы вернемся к Шерлоку и прочитаем еще один не очень сложный отчет.

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

#report #audit
👍2