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

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

А пока, несколько слов о том, сколько нужно учить Solidity.

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

У всех путь начинается с простых токенов и nft, с которых мы узнаем, что есть некоторые стандарты, типа ERC20, ERC721. Учимся дальше и узнаем, что таких стандартов, уже больше 6 000.

Выдыхаем, когда понимаем, что нужно знать всего пару десятков основных: ERC712, ERC1155, ERC4626 и т.д. Пытаемся разобраться с ними, читаем документацию, смотрим видео, разбираем примеры.

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

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

Теперь мы более менее понимаем, что к чему и готовы идти дальше. Смотрим как взаимодействовать с другими популярными протоколами, типа Chainlink и Uniswap. Пишем свой первый обменник.

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

Теперь мы хотим убедиться, что все работает как надо и погружаемся в тестирование контрактов. Учим основы Foundry, разбираемся с фазз и инвариант тестированием, а позже узнаем про формальную верификацию. WFT! Этому нет конца и края, но мы упорные! И уже слегка упоротые...

Мы нашли несколько интеграционных ошибок в нашем протоколе и хотим разобраться с кодом defi протокола. Лезем в источник Compound и теряемся на неделю...

С мыслями "Да, пофиг уже" погружаемся в код и токеномику других популярных DeFi протоколов.

Думаете мы стали сеньором? Угу, уверенный мид!

И как вы теперь думаете, сколько на все это потребуется времени?

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

В мире Solidity и web3 нет определенного количества знаний, которые можно получить и дальше "сидеть сложа лапки". Это непрерывный процесс обучения.

Подумайте, готовы ли вы потратить более двух лет на получение новой хорошей профессии?

#solidity
🔥22👍4👏2
Миша, спасибо!

Вчера весь день был в дороге и только вечером смог добраться до интернете и соц сетей. Захожу на канал и вижу странную цифру 1.7 участников. Я такой: "WTF?! Еще вчера было 1.5, что произошло? Откуда столько новых?!"

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

Даже в чат писал, что происходит. И мне указали, что наш канал был упомянут в видео на Ютуб от Миши Ларченко.

Я был очень приятно удивлен! Миша, спасибо за доверие и рекомендацию!

Если кто-то из участников канала захочет посмотреть это видео - https://youtu.be/l_r_ALtrY9Y?feature=shared

Ну, и сам канал Миши. Он рассказывает о мире программирования, языках и лайфстай в целом - https://youtube.com/@larchanka?feature=shared

P.S. Первый раз, кто-то рассказывает о нашем канале вне Телеграма. Авось скоро и на РБК попадем))

Всем приятной недели, а я дальше в путь.

#wow
🔥31👍94
Возвращаемся к работе

Фух, наконец, я вернулся из небольшого отпуска с новыми силами и готов дальше делать разборы!

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

Итак, меня зовут Влад. Этот канал я завел около 2 лет назад, 13 июля 2022 года, и изначально планировал учиться Solidity в группе единомышленников, которых пытался собрать на VC и Пикабу (угу, мое темное прошлое). Сам я пришел из web2 и был фуллстек программистом: php / js. Из-за событий того года много работы за рубежом "обломалось" и пришлось искать новые способы выхода на мировой рынок. Тогда я познакомился с криптой и захотел разобраться в ней на уровне кода. Канал завел скорее для отслеживания своего прогресса и мотивации к ежедневному обучению.

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

Осенью того же года я заинтересовался вопросами безопасности смарт контрактов и стал активно изучать разные взломы и проходить популярные CTF задачи, типа Ethernaut. С прошлого года порой участвую в публичных конкурсах на площадках code4rena, cantina и codehawks. Провел несколько соло-аудитов.

Год назад я запустил небольшой курс по Solidity, состоящий из 4 модулей. Его прошли более 120 учеников!

Также я написал большой бесплатный курс по Foundry, который все могут изучить на данном канале: https://news.1rj.ru/str/solidityset/962 .

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

Весной этого года на канале мы начали погружение в defi и разбирали Uniswap V2, погружаясь в детали кода. Но я увидел, что очень малому кругу читателей интересная эта тема и решил выделить разбор defi в отдельный канал или что-то еще. Позже расскажу, как это будет в итоге.

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

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

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

Если у вас есть какие-либо предложения или советы по контенту, буду рад обсудить.

А так, возвращаемся к работе и планируем образовательное лето вместе!

Добро пожаловать!

#offtop
👍29🔥43
Какие проекты написать для портфолио?

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

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

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

P.S. Проекты рекомендуется загружать на GitHub, так как это общепринятый ресурс для разработчиков, наполнение которого действительно может сыграть роль при найме.

Итак, проекты для портфолио:

1. Практический файл, где вы показываете, как работать со сложными типами данных и вводом\выводом информации с них. Там моно показать примеры со вложенными маппингами, многоуровневыми массивами, все это в комбинации с enum и struct.

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

2. Контракты своего токена и NFT. Тут объяснения излишни. Просто стандартная ступень начальной практики.

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

Сразу - 10% токенов;
3 месяца - 15%;
6 месяцев - 30%;
1 год - 5%;
3 года - 20%;
5 лет - остальное;


Зачем: показать, что вы можете работать с timelock и простой математикой в контрактах.

4. Контракт Vault на основе ERC4626, в для пользователя минтятся токены протокола в соотношение 0.75% от внесенных им стейблкойнов, и взамен печатается NFT для подтверждения депозита. Если пользователь забирает токены раньше, чем через полгода, то он теряет свои 0.25%, если позже - получает 0.05% дополнительно.

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

5. Стейкинг контракт, где одни пользователи делают депозит и получают нативные токены протокола, а другие могут брать займы \ флешзаймы под залог своих токенов. При невозврате займа, его токены переводятся с помощью Uniswap в другой токен и распределяются между депозиторами токена и самим протоколом в соотношении 90/10.

Зачем: показать, что вы можете работать с простыми defi системами и интегрировать протокол с Uniswap.

6. Proxy factory контракт, который может делать деплой Vault контрактов для пользователей. Функционал Vault контракта может обновляться government контрактом после голосования.

В Vault контракт пользователи могут вносить ETH/WETH и позже снимать USDT/USDC. Актуальная цена на снятие получается от оракулов TWAP и Chainlink.

Зачем: показать, что вы можете работать с прокси и оракулами.

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

Сам протокол управляется Gnosis Safe Wallet и с помощью голосования можно изменить процент комиссии.

Зачем: показать, что вы можете работать с Gnosis и понимаете работу разных сетей.

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

Также несколько рекомендаций при написании протоколов:

1. Используйте комментарии, лучше в natspec формате;
2. Если понимаете как, то можно использовать assembly вставки;
3. Будет здорово, если вы в комментариях напишите свои предположения по безопасности функции. Например, "в этой функции могут быть такие проблемы, которые при необходимости можно решить так..."
4. Также будет просто здорово, если сможете написать простые unit тесты на Foundry / Hardhat.

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

#practice
22👍9🔥2😁1🤯1
Токен написать и косточкой не подавиться

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

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

Да, создать свой токен и загрузить его в Эфир можно менее чем за пять минут: используя либо конструкторы, либо вообще скопировав чужой контракт. И если мы просто "балуемся" для своего удовольствия, то все ок. Но если реально работаем над проектом, то...

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

Сейчас бы прикрепить сюда картинку Боромира из Властелина Колец с подписью: "Нельзя просто так взять и создать свой токен", но мы же серьезный канал)

Вообще, хорошо бы сначала разобраться в самом стандарте EIP и эталонных примерах реализации (например, Open Zeppelin), прежде чем приниматься за создание своего токена. Я бы даже сказал, что не стоит играться с токенами, пока не сможешь понять, за что отвечает каждая строка в контракте ERC20 от OZ.

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

После этого поискать популярные отличия уже созданных токенов от ERC20. Тот же лист weird ERC20 tokens может дать много пищи для размышлений и бессонных ночей.

Кроме того, нужно понимать, что токены (может за исключением мемкоинов), редко используются как отдельный контракт, а скорее в рамках различных протоколов: пулы, стейкинг, займы и т.д. А это еще отдельный вид изучения безопасности протокола!

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

#erc20
👍14
Небольшой роадмап для начинающих

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

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

Многие, исходя из сообщений в различных web3 группах, приходят в эту сферу с разными целями:

1. Научится создавать DAPP и писать смарт контракты;
2. Запустить свой проект / биржу;
3. Слышали про выплаты в конкурсных аудитах и хотят начать зарабатывать там;

4. Хотят запустить свою ноду и майнить крипту;
5. Интересуются блокчейном в целом и хотят научиться создавать свои сети;
6. Думают быстро разбогатеть на крипте, торгуя на бирже;
7. Планируют создать своего defi бота;

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

Для создания блокчейн сетей и создания ботов могут потребоваться и другие языки, например, Rust или Python (тут лучше копать в этом направлении). Биржевая торговля - вообще мимо этого канала. А про запуск своей ноды можете спросить в чате, есть куда более опытные участники, которые могут подсказать, с чего начать.

Поэтому, если вам интересны эти 4 темы - к сожалению, ничем помочь тут не смогу.

А вот для первых трех - вы попали по адресу на этот канал - можно предложить такую схему начального обучения.

1. Типы данных в Solidity. Это такие "кирпичики", из которых состоит сам язык. Без должного навыка и понимания их работы никакое обучение дальше не пойдет. Точнее, пойдет, но из-за большого количества нюансов вы совершите много ошибок, которые в конечном итоге приведут к потере ваших денег. Это действительно важная тема, хоть и кажется простой.

Обратите особое внимание на сложные типы данных: array, mapping, struct и enum. А также как они работают друг с другом.

2. Функции, области видимости и циклы. Когда закончите с типами данных, можно переходить к изучению функций. Начните с самых простых: прибавление / вычитание чисел, установка переменных, ввод данных и их вывод из вложенных маппингов и массивов структур и т.д.

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

4. Низкоуровневые вызовы: call, staticcall, delegatecall. Первое касание с опкодами EVM и одни и самых популярных методов, которые используют разработчики в своих прjтоколах. Если с call все более-менее понятно, то понимание работы delegatecall может занять у вас кучу времени. Тем не менее, его потратить стоит, чтобы не нарваться на проблемы в будущем..

5. И вот только после первых четырех пунктов можно приступать к изучению токенов и nft, а именно базовых стандартов ERC20 и ERC721. И тут нужно детально разбирать код контрактов популярных библиотек, типа Open Zeppelin, а также некоторые простые уже существующие токены: USDT, USDC, WETH и т.д. Будет хорошо, если вы сможете сказать, за что отвечает буквально каждая строка в их контрактах и к какому результату приведет выполнение той или иной функции.

6. Далее идут популярные паттерны: голосование, timelock, government, аукцион и DAO. По сути, на этих 5 архитектурных решениях строятся 90% всех протоколов.

7. После этого вы можете перейти к более сложным стандартам ERC, как например, ERC4626 - vaults, или ERC712 - подписи.

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

Как и всегда я очень рекомендую канал Ильи, где хорошо объясняются базовые темы по Solidity:

https://youtu.be/8A8-7Ks26yY?si=6BCsvfEl82TkHfR9
🔥135👍4❤‍🔥1
а если у вас все ок с английским языком, то можете записаться на Updraft:

https://updraft.cyfrin.io/

Пост получился очень объемным, поэтому будет еще вторая часть про оставшиеся темы для погружения в Solidity.

#start #roadmap
6
Немного ссылок и чуть больше о Solidity

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

"Научившись Solidity, я могу писать смарт контракты только для Эфира? А на другие блокчейны нужны свои языки?". И вроде вопрос для опытных разработчиков простой, но для начинающих может быть весьма актуальным. Поэтому хочу ответить на него тут.

Из википедии возьмем определение языка:

Solidity is a statically typed programming language designed for developing smart contracts that run on the Ethereum Virtual Machine (EVM) or compatible virtual machines.

Другими словами, он подходит для написания программ, которые работают на EVM (виртуальной машине Эфириума). На сайте chainlist вы можете найти весь список сетей, где может быть использован Solidity.

В целом, можно сказать, что выучив Solidity, вы сможете писать контракты для таких сетей как:

1. Optimism;
2. Arbitrum;
3. ZK Sync;
4. Polygon;
5. BNB Smart Chain;
6. Filecoin;


и многих многих других! Более того, буквально каждый месяц появляются новые сети, например, Blast или Base, которые привлекают к себе внимание и инвестиции.

На мой взгляд, Solidity разработчики будут достаточно востребованы в ближайшее время, с одним лишь условием: требования значительно возрастут! И чем раньше вы начнете учиться ему, тем быстрее сможете влиться в поток!

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

Все мои ресурсы на английском языке, так как именно на нем можно найти самую актуальную информацию.

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

Список Twitter

Далее пара каналов на Ютуб:

Smart Contract Programmer
Patrick Collins
patrickd
Owen Thurm

Мой любимый блог:

RareSkills tutorials

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

Updaraft free courses
Alchemy University
RareSkills bootcamp

Учиться никогда не поздно.

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

#solidity #chains #links
🔥12👍21
Chinmaya и практический летний модуль

В прошлом году один из ныне крутых аудиторов Chinmaya Farkya выложил в публичный доступ свой репо (534 stars, 73 forks) с заметками по Solidity, которые он собирал на протяжении всего своего обучения. Там встречаются как самые простые подсказки по языку, так и некоторые нюансы из официальной документации.

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

В сборнике около 400-500 пунктов, и я мог бы разбирать с примерами по несколько в день. Их более чем хватит до конца лета, а то и осени!

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

1) 7 недель интенсивного обучения + 2 недели на финальный практикум;
2) 30 уроков по стандартам и паттернам;
3) Два проекта в портфолио к ученику;
4) Еженедельные практические задания;
5) Основы безопасности смарт контрактов;

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

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

Это лето может быть настоящим вызовом с крутыми результатами в конце.

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

#solidity #курс
🔥262👍2
Solidity hints. Часть 1

Некоторое время думал, как назвать цикл постов с описанием пунктов по Solidity от Chinmaya, о котором писал в предыдущем посте. В общем теперь это будут посты в формате заметок с пояснениями: Solidity hints.

Я буду писать заголовок пункта из репо и давать к нему небольшое описание.

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

1. Sending ether to a contract B from a contract(for eg. using .send or .transfer), executes the code of B’s fallback function if it exists (and receive doesn’t exist).

Когда мы отправляем Эфир (не токены) на другой контракт, где-то "под капотом" проверяется наличие дополнительных данных в транзакции (msg.data). Если они есть, то выполнение сразу падает в fallback функцию, если же данных нет - в receive(), параллельно проверяя существует ли receive вообще. Если ее такой функции нет, то снова вызывается fallback. Если же и его нет, то транзакция откатывается.

Есть два случая, когда Эфир все равно попадет на счет нового контракта, но, думаю, об этом будут еще пункты.

Можно эту схему разложить на:

send Ether
|
msg.data is empty?
|
no => fallback()
yes => is receive() exist?
|
yes => receive()
no => fallback()



1. Division result is auto rounded towards zero

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

    function getMath() public pure returns(uint256) {
return uint256(19) / uint256(2);
}


Результатом будет 9. Вроде как потеря 0,5 не так страшна, пока не начнем думать, что это мог быть Эфир, стоимость под $ 2000.

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

2. Division by zero causes panic error, escapes unchecked

Деление на 0 приводит к критической ошибке и реверту транзакции, т.е. просто не делите на ноль.

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

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

#hints
👍161
Solidity hints. Часть 2

Ну, что же, сегодня разберем еще пару пунктов из репо.

3. Always check the return value of send. Send fails if call stack depth is at 1024 (can be forced by the caller).

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

Always check the return value of send => всегда проверяйте успешность вызова транзакции отправки. Тут может быть и send(), и transfer(), и transferFrom(), и низкоуровневый call(). Хотя тут есть свои некоторые нюансы.

Если мы говорим об отправке Эфира, то проверять возвращаемые значения через bool можно в функциях send() и call(), так как сам transfer() ревертится в случае неудавшейся отправки (там можно ловить ошибку немного по другому, но об этом в следующий раз).

Если же говорим о токенах, то и в transfer()/transferFrom() также необходимо проверять возвращаемый bool. А зачем?

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

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

Send fails if call stack depth is at 1024 (can be forced by the caller).

Тут нужно знать как работает память в Solidity и EVM. Грубо говоря, есть некая область памяти под названием stack.

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


  тарелка - 1
тарелка - 2
тарелка - 3
тарелка - 4
тарелка - 5


Stack работает так, что можно использовать только самые верхние "тарелки" для каких-либо действий. Для того чтjбы наполнить "пятую тарелку", нам нужно переместить ее в начало. Или же, более реальный пример, чтобы сложить значения, которые лежать в "тарелках" 3 и 4, мы должны каждую из них переместить по отдельности в самый верх и уже потом выполнить действие сложения.

P.S. Более опытные разработчики, имеющие дело с памятью, можете поправить меня, если я где-то сказал не так.

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

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

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

В заключении поста, можно сделать простой вывод: всегда проверяйте успешность пересылки активов!

#transfer #send #call #bool
👍81
Контракты и паттерны

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

А пока пара слов про паттерны в контрактах, которые следует знать разработчику.

Вообще "паттерн", на мой взгляд, это какая общая идея, которую можно использовать во многих проектах. В некотором роде, популярные библиотеки от Open Zeppelin с реализацией токенов ERC20 и ERC721 тоже являются частью вселенной (кто пропел?) паттернами.

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

1. Архитектурные паттерны;
2. Паттерны кода;
3. DeFi паттерны;

В первую категорию можно отнести:

1. Аукционы: голландский и английский. Там пользователи делают свои ставки, и в зависимости от типа аукциона, цена падает или растет.

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

3. DAO и governance - популярные (де)централизованные системы и управление протоколом через голосование пользователей;

4. Commit / reveal - некая система (например, голосование) основанная на хешировании данных и последующее их подтверждение;

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

Ну, и популярные ныне DeFi паттерны:

1. Стейкинг - депозит токенов с целью получить выгоду от последующих наград ил выплат;

2. Айрдропы - первоначальная раздача токенов для привлечения внимания к протоколу;

3. Займы и ликвидации - уже традиционный инструмент большинства финансовых протоколов;

4. Свапы и Vaults - обмен токенов;

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

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

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

Всем отличной пятницы и приятных выходных!

#patterns
🔥10
Solidity hints. Часть 3

Постепенно выходим из состояния выходного дня и принимается за работу.

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

1. Подготовить крутую практическую программу для 2 модуля курса;
2. Запустить 8 недельный курс на все лето;
3. Разобрать 4-5 defi проекта (пока в планах, Uniswap V3, Compound, Euler и DyDx);
4. Вывести на зарубежный рынок свой проект по пре-аудиту протоколов;
5. Закончить соло аудит;

И это еще не учитывая другие планы вне web3. В общем лето будет - ух!

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

А пока, возвращаемся к разбору пунктов из репо Chinmaya:

4. Using low level functions to call a contract = handing over control to it

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

Это, вероятно, один из самых популярных вопросов базовой безопасности смарт контрактов, который изучают начинающие аудиторы на различных CTF - capture the flag - задачки по взлому контрактов.

Например, следующий код с уязвимостью реентранси демонстрирует эту проблему:

mapping (address => uint) private userBalances;

function withdraw() public {
uint256 bal = userBalances[msg.sender];
require(bal > 0);

(bool sent,) = msg.sender.call{value: bal}("");
require(sent, "Failed to send Ether");

balances[msg.sender] = 0;
}


Есть некий маппинг, где хранятся балансы пользователей, и функция вывода средств с контракта. Мы вызываем низкоуровневый call на msg.sende и передаем всю сумму с баланса.

Отправителем транзакции вполне может оказаться смарт контракт, который "ловит" внешние вызовы в него через функции receive() или fallback(). И уже в них он может реализовать какую-либо хакерскую атаку, например:

    fallback() external payable {
if (address(etherStore).balance >= AMOUNT) {
etherStore.withdraw();
}
}


т.е. он "ловит" call функцию, и перенаправляет вызов обратно в контракт для вывода остальных средств. В итоге это приведет к опустошению первого контракта. А следовательно другие пользователи потеряют все свои активы.

Вообще, всегда нужно быть аккуратными с низкоуровневыми вызовами call() и delegatecall(), желательно не давая пользователям контролировать адрес, куда идет вызов.

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

Будьте аккуратны!

#call #delegatecall
👍5🔥21
Solidity hints. Часть 4

Идем дальше, и на очереди у нас пункт под номером пять:

5. Before using delegatecall, ensure that storage layout is in same order in both contracts

Используя функцию delegatecall(), убедитесь, что переменные состояния идут в одинаковом порядке.

Еще одна популярная проблема с низкоуровневыми функциями. Возьмем к примеру два контракта:


contract A {
address public sender;
address public owner;

function setAddress(address _contract, address addr) public payable {
(bool success, bytes memory data) = _contract.delegatecall(
abi.encodeWithSignature("setAddress(address)", addr)
);
}
}

contract B {
address public owner;
address public sender;

function setAddress(address addr) public payable {
owner = msg.sender;
}
}


Если вы не помните основную особенность delegatecall(), то напомню, что он "как бы забирает" функцию из другого контракта и выполняет ее в рамках контракта, где он был вызван.

Если мы вызовем функцию setAddress() в контракте А, то и изменение в памяти произойдет в контракте А, а не в контракте В, куда идет вызов.

В данном примере мы видим, что функция setAddress() в контракте В должна обновить переменную owner. Допустим, мы хотим обновить такую же переменную у себя в контракте А.

Сделав вызов функции А::setAddress(), транзакция пройдет успешно, но в А обновится переменная sender, а не owner, как это было запланировано!

Это произошло именно из-за того, что был нарушен порядок переменных в контракте. Поэтому за ним нужно пристально следить. Да и вообще, если не знаете точно "зачем", то использовать delegatecall крайне не безопасно.

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


#delegatecall
👍7
Программа летнего практического модуля

Сегодня я рад представить вам программу летнего модуля продолжительностью 8 недель!

Это будет крутой курс направленный прежде всего на практику с кодом и формирование правильных привычек разработки смарт контрактов. Вы узнаете не только про популярные стандарты ERC20, ERC721, ERC4626, но и научитесь сами понимать и разбирать менее изнвестные EIP.

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

Это будет очень интенсивный модуль! Итак, программа практического модуля:

Неделя 1

Урок 1. Подготовка рабочего пространства
Урок 2. Плагины и настройки
Урок 3. Терминал, Node JS, NPM
Урок 4. Работа с GitHub

+ Интенсив с нуля для начинающих

Неделя 2

Урок 5. Стандарт ERC20. Разбор кода и EIP
Урок 6. ERC20 от Open Zeppelin
Урок 7. Свой токен и подключение OZ
Урок 8. ERC20. Особенности и разнообразие
Урок 9. ERC20. Проблемы безопасности

Неделя 3

Урок 10. ERC721. Разбор кода и EIP
Урок 11. ERC721. Использование в проектах
Урок 12. ERC721. Проблемы безопасности
Урок 13. Подключение токенов в свой проект

Неделя 4

Урок 14. Hardhat. Подключение и настройка
Урок 15. Hardhat. Подключение контрактов и чтение тестов
Урок 16. Foundry. Настройка и запуск
Урок 17. Foundry. Тесты

Практикум после 1-й части модуля


Неделя 5

Урок 18. Стандарт ERC4626
Урок 19. Стандарт ERC4907
Урок 20. Стандарт ERC6551

Неделя 6

Урок 21. Голландский аукцион
Урок 22. Multisig и Timelock
Урок 23. Commit/reveal
Урок 24. DAO и governance

Неделя 7

Урок 25. Ролевая система в контрактах
Урок 26. Файловый паттерн
Урок 27. Структуры storage
Урок 28. Селекторы функций и поинтеры

Неделя 8

Урок 29. Defi паттерн: стейкинг
Урок 30. Defi паттерн: ликвидации и займы
Урок 31. Базовая безопасность и аудит

Финальный практикум модуля 2

Старт обучения: 1 июля


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

#курс
🔥10😱1
Кто планирует пойти на практический летний модуль? Прошу оставить свой голос (кроме учеников текущего 1 модуля)
Final Results
64%
Да, я точно иду
36%
Нет, пропускаю
Проблемы, когда пытаешься учиться сам

Пару месяцев назад, когда я начал на канале разбирать Uniswap V2, у меня появилось дикое желание углубиться в DeFi системы: разобрать их механику, принципы начисления процентов и другие математические операции, я столкнулся с той же проблемой, с какой сталкивался в самом начале своего обучения языку Solidity.

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

Есть куча отдельных статей (спасибо RareSkills!), но собирать все вместе и обрабатывать бывает очень сложно. Я смотрел Compound, а потом такой: "Ну, глянем деривативы DyDx"... И все... И уже собираешь по кусочкам посты из разных уголков сети.

P.S. Если знаете вот прям хорошие статьи разборы по DyDx, Lido, GMX, Renzo, Balancer и других, буду признателен, если поделитесь в комментариях.

Или другой пример, вот изучил ты Uniswap V2 и что дальше лучше смотреть: перейти на Uniswap V3 или посмотреть более простой Balancer V2?

В общем, поиск и структурирование информации порой занимает больше времени, чем само обучение.

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

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

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

Тоже самое и с написание смарт контрактов. Начните с малого и до конца лета получите отличную базу знаний и практики!

Старт курса 1 июля!

#курс
👍11🔥5
Чем отличается джун от мидла?

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

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

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

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

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

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

Что можно сохранять на начальном уровне обучения?

1. Практика с функциями и типами данных. Это просто, но это покажет, что вы серьезно подходили к своему обучению. На первом модуле курса было два практикума, и во втором были упражнения со вложенными маппингами и структурами. Он может стать прекрасным примером того, что вы умеете работать со сложными типами данных.

2. Ваш первый токен или nft. Написали токен? Создайте файл "ERC20 practice" и тоже загрузите на Git.

3. По сути, изучая каждый новый ERC (подписи, vaults, прокси, и т.д.) вы можете создавать практический проект. Не волнуйтесь за качество своего кода. Так или иначе 100% безопасным его вы не сделаете, но при этом обязательно добавляйте комментарии! Это прям очень важно!

4. Когда вы изучите базис, то можете глянуть этот пост, где я предлагаю несколько проектов для практики: https://news.1rj.ru/str/solidityset/1112 Каждый из них покажет потенциальному работодателю ваши знания и навыки в программировании. А если еще к ним будут приложены хотя бы простые тесты - это сильно повысит шансы на получение работы.

На текущем модуле мы делаем акцент именно на практику. Если вы будете действительно выполнять каждое задание и практикумы, то в итоге в вашем GitHub может появиться более 14 практических проектов! И это за два месяца!

Работы будет очень много! Это будет серьезная прокачка навыков за лето!

Старт уже 1 июля!

#курс
👍12🔥21
А есть ли интенсивы для мидлов и сеньоров?

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

За весь период своего обучения я погружался во множество различных тем web3 и аудита: от простых CTF до расчетов в DeFi протоколах. Ну, т.е. я хочу сказать, что много знаний уже есть на более-менее базовом уровне. Но вот мне потребовалось на выходных найти информацию по работе с Gnosis Safe: подключение, нюансы безопасности, общая архитектура протокола. И в большинстве статей поисковой выдачи было что-то типа: "Первые упоминания о гречке датированы 8 веком до нашей эры...". Пришлось копаться в официальных доках.

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

А ведь сколько пользы было бы, если бы зарубежные компании выпускали небольшие курсы по определенным темам (например, как RareSkills). Вот мне было бы интересно узнать:

1. Как работает Gnosis Safe;
2. Как подключать OpenSea;
3. Тики Uniswap V3 и хуки Uniswap V4;
4. Абстрактные аккаунты и их безопасность;
5. Особенности деплоя контрактов на разные L2 сети;
6. Безопасные ликвидации в DeFi протоколах;
7. Что такое блобы и их практическое применение сегодня;

и еще много других нишевых тем с разбором документации, кода и вопросов безопасности.

С одной стороны, крутым разработчикам и аудиторам нафиг это не надо записывать интенсивы, но что насчет компаний, которые проводят стримы и обучающие сессии, те же RareSkills, Alchemy, Updraft?

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

А я пошел дальше работать над предстоящим модулем, старт которого уже на следующей неделе!

#обучение
🔥9👍21
Обучение в потоке

Хочу еще поделиться с вами некоторыми неожиданными открытиями, которые я получил, проведя уже 5 модулей - 4 от первого потока и 1 весенний.

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

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

1. "Сроки обучения не бесконечны." - мое первое открытие из этой серии. Действительно, когда мы учимся сами по видео на ютуб или задействуем какой-никакой роадмап, мы понятия не имеем, сколько времени этой займет: месяц или полгода. В наших представлениях учеба является каким-то бесконечным процессом.

А на курсе же мы точно знаем, что, например, через 8 недель это закончится. И уже легче планировать свое время и нагрузку.

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

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

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

5. "Структура и экономия времени!". Также для большинства учеников сыграло ключевую роль структурирование информации; многие говорили, что покупают курс только поэтому. Они не хотели сами составлять себе программу, искать информацию по темам и понятия не имели, как практиковаться с кодом. "Зачем я буду тратить половину времени на поиск, когда тут уже все сделано за меня?" - железный аргумент!

Здорово, что у нас получилось собрать столько учеников и пройти этот путь вместе!

У вас все еще есть время присоединиться к потоку!

Программа курса

Старт уже 1 июля!

#курс
👍142👎1
На сколько будет доступ к каналу и материалам?

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

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

Ну, и, конечно, понятно волнение многих: "А что будет, если я не успею пройти модуль вместе со всеми? У меня же еще работа (учеба, дом, семья и т.д.). Могу ли в своем темпе проходить?".

Именно поэтому отвечаю на все эти вопросы в одном отдельном посте.

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

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

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

Надеюсь, теперь вам будет проще решиться для себя попробовать этот модуль.

Программа курса

Старт уже в понедельник!

#курс
🔥14👍5