ch
Feedback
Solidity. Смарт контракты и аудит

Solidity. Смарт контракты и аудит

前往频道在 Telegram

Обучение Solidity. Уроки, аудит, разбор кода и популярных сервисов

显示更多
2 592
订阅者
无数据24 小时
-17
+430
帖子存档
Практика практике рознь Практика для новичка в программировании является чуть ли не единственным способом обучения. Если просто смотреть видео или читать посты, можно уловить суть языка, но написать код в редакторе с полным пониманием "а зачем ты это пишешь?" - немного другое. Мне всегда было проще учиться на примерах. И чем лучше становился мой навык владения кодом, тем сложнее требовались эти примеры. Вопрос был в том, а где их взять? Когда год назад, я для практики с defi открыл код протокола Compound, то был немного в шоке от объема и сложности. Перешел на Uniswap... Лучше не стало. На тот момент меня спасли конкурсные аудиты. Я смотрел различные репо и учился читать код профессиональных команд. Ловить связи функций, поток транзакций, писать тесты и многое другое. Я подбирал для себя не самые сложные аудиты и рос вместе с ними. Задачи ethernaut, dvd, capture the ether помогли мне понимать "внутреннюю кухню" функций и языка. Но и к ним нужно подходить с умом. На третьем модуле я хочу передать этот опыт ученикам, чтобы ваш путь к разработке занял намного меньше времени, чем у меня. Вы должны научиться не только писать свой код, но и разбираться в чужом. Брать от туда лучшие практики и паттерны, видеть проблемы и избегать их в своих проектах. Это и будет основной темой третьего модуля. Сегодня были открыты продажи. Успейте присоединиться! Программа модуля.      Реквизиты для оплаты Старт 2 октября. #курс

🥳🥳🥳 Открытие продаж курса: Модуль 3 🥳🥳🥳 Более 90 человек в общем количестве прошли обучение на одном из модулей курса, было выложено 35 уроков по базовым темам Solidity, 3 финальных практикума и 100+ вопросов для самопроверки! И это только начало! Теперь самое время научиться работать с полученными знаниями и попрактиковаться с кодом более профессионально! Весь октябрь будет построен вокруг интенсивной работы с кодом: чтение, написание и проверка. Готовы? Присоединяйтесь!   Сегодня я открываю продажи и начинаю добавлять участников в закрытый Телеграм канал. Итак, как пройти запись и попасть на канал: 1. Оплачиваем курс по реквизитам ниже. 2. Скидываем мне в личные сообщения чек об оплате или хеш транзакции; 3. После этого я добавляю Вас в закрытый канал модуля. Продажи будут открыты до конца этой недели. Потом на третий модуль будет не попасть! Про доступ на первый и второй модули: Вы также можете купить доступы на каналы с первым и вторым модулями, где были выложены уроки. Проходить его сможете в своем темпе, задавая вопросы в чате или мне лично. Стоимость первого и второго модулей, как и была: 2000 рублей или 25 USDT/USDC каждого. Реквизиты для оплаты: 1. Перевод на карту: 4276 5200 1451 3846, Владилен Александрович З 2. Перевод на криптокошелек: 0x3d3cE0554A25DBdB7fb5fc07062881A02125C7d6 . Переводы необходимо делать в сети BEP-20, в криптовалютах: USDT или USDC. Сумма за третий модуль: 3000 рублей или 30 (USDT...) Первый и второй модуль: 4000 рублей или 50 (USDT...) По всем вопросам можете писать в чат или личные сообщения. Программа курса. Старт 2 октября! #курс

Что тормозило мое обучение? Во время своего обучение мне всегда не хватало информации о том, как можно использовать новые знания. Вот, к примеру, изучил я прохождение по массиву в цикле, а что с этим делать дальше - не знаю. Или же, разобрался с этим пресловутым delegatecall - а нафига? Хорошо знать что-то, другое дело уметь применять это в нужный момент.  Еще одна проблема встала, когда я пошел устраиваться на работу и мне прислали тестовое задание, в котором настройка проекта шла через foundry, с которым я ранее не работал вообще. И пришлось "изобретать велосипед", чтобы хоть как-то наладить это для себя через hardhat. Далее трудности стали возникать при первых конкурсных аудитах, когда нужно было быстро понять, в чем суть протокола, и за что отвечают те или иные функции. К слову сказать, и сейчас на это уходит день-два, но это скорее из-за сложности и размера проекта, а не из-за того, что что-то не понятно.   Все это могло проходить проще, если бы я уже на этапе обучения разобрался, как работать с реальными проектами и читать код. Вот и на третьем модуле я хочу показать ученикам, как это делается проще и быстрее, с учетом редактора кода, который является отличным инструментом для анализа. После первых двух модулей, у вас уже есть знания о базовом синтаксисе языка и первой практикой кода. Сейчас пришло время научиться этим всем пользоваться! Присоединяетесь! Программа курса          Отзывы Старт: 2 октября #курс

*Отзывы после второго модуля курса* Хотел бы поделиться парой отзывов, которые написали ученики второго модуля. Когда делал з
+3
*Отзывы после второго модуля курса* Хотел бы поделиться парой отзывов, которые написали ученики второго модуля. Когда делал запуск первого модуля, то немного боялся, что курс не понравится и мало кто захочет продолжить свое обучение со мной. Приятно бывает ошибаться. Вот уже третий модуль готовится к старту на следующей неделе, и большая часть учеников с обоих потоков планируют продолжить свой путь! Это здорово мотивирует работать над курсом еще усерднее, подбирая материалы и практику для прокачки навыков! Третий модуль будет еще круче! #курс

Чуть больше о практике модуля Меня попросили рассказать чуть больше о практической стороне модуля, и чем она будет отличаться от практических заданий в предыдущих частях курса. Итак, для тех, кто не знает, практически после каждого урока в предыдущих модулях было небольшое задание: прочитать статью, написать функцию или контракт, подключить библиотеку и т.д. В этот раз будет по другому. Сейчас главная цель не только дать основную идею урока, но и научить работать со средой IDE, GitHub и реальными проектами, которые могут попасться на собеседовании или уже в работе по найму. Вы научитесь быстро разворачивать протоколы в своем редакторе кода, понимать, за что отвечают функции, выработать свой метод чтения смарт контрактов и замечать проблемы в коде. В модуле будут несколько реальных протоколов для изучения архитектуры и функционала их систем, разборы задач с ethernaut и дополнительные задачи для самостоятельного решения, а также практика по итогам третьей и четвертой недели, которую вы сможете показать в резюме. После легкой первой недели, приготовьтесь к тому, что нужно будет уделять много времени на практику. #курс

Программа 3 модуля курса Заканчивается сентябрь, я понемногу выхожу из отпуска, и пора продолжать наше обучение по курсу "Начинающий разработчик смарт контрактов". На предыдущих двух модулях мы прошли базовые элементы языка, узнали больше про стандарты EIP, наследования и низкоуровневые вызовы, а сейчас пришла пора практики. Третий модуль будет хардкорно практическим. Вместе с темами уроков ученики будут тренироваться: 1. Работе в редакторе кода; 1. Работе с GitHub; 2. Написанием комментариев к коду; 3. Изучением контрактов реальных проектов; 4. Решении задач и базовые понимания безопасности; 5. Плюс два финальных проекта, которые можно будет показать в резюме; Будет очень много практики! Я хочу, чтобы к моменту 4-5 модуля, где мы будем проходить уже более специфические темы, типа прокси контраков и работе с памятью, ученики имели хорошую базу и навыки работы с кодом. Итак, программа третьего модуля: 1. Подготовка и настройка IDE 1.1. Плагины для работы 2. Терминал, Node js, NPM 3. Начало работы с Git и GitHub 4. Hardhat. Настройка и запуск 5. Hardhat. Из чего состоит 6. Foundry. Настройка и запуск 7. Foundry. Из чего состоит 9. Голландский аукцион 10. MultiSig и Timelock 11. Commit/reveal 12. DAO и governance 13. Ролевая система 14. ERC4626 15. ERC4907 16. ERC6551 Ориентировочный старт: 2 октября Стоимость: 3000 рублей, 30 (USDT, USDC) Хочу также напомнить, что программа курса пишется для новичков в программировании, поэтому только на данном этапе мы будем проходить github и редакторы кода. Начало продаж, по традиции, в среду. #курс

Голоса для канала? С новым обновлением в Телеграм появилась возможность для каналов делать сторис. Как думаете, нужна ли такая опция для контента? Может делать дневные задачи с ними? Можно поддержать канал бустом по ссылке: https://t.me/solidityset?boost #boost

Баг из протокола Mia На днях выпустили отчет по аудиту Mia DAO, где был один примечательный med issue, о котором хочется рассказать. Посмотрите на код ниже и подумайте, в чем тут может быть проблема: function _normalizeDecimalsMultiple(uint256[] memory _deposits, address[] memory _tokens) internal view         returns (uint256[] memory deposits) {    for (uint256 i = 0; i < _deposits.length; i++) {       deposits[i] = _normalizeDecimals(_deposits[i], ERC20(_tokens[i]).decimals());    } } Более опытные разработчки, вероятно, сразу поймут, в чем дело. Хотя этот баг был найден всего лишь одним аудитором. Ответ: Функция не будет работать, так как deposits никогда не были сохранены в памяти. Вот как правильно нужно было сделать: {   uint len = _deposits.length;         deposits = new uint256[](len);   for (uint256 i = 0; i < len; i++) {      deposits[i] = _normalizeDecimals(_deposits[i], ERC20(_tokens[i]).decimals());   } } Интересный пример, не так ли? #bug

Коротко о Keccak256 Keccak256 — это криптографический алгоритм хеширования семейства SHA-3. Подробно о том, как работает алгоритм, можно почитать в стандарте и в документации от команды keccak. Для понимания его работы достаточно знать только несколько основных вещей о хеш-функциях и о самом алгоритме. Что такое хеш-функция? Хеш-функция — это функция, которая принимает произвольный набор данных в качестве входных данных и выдает хеш-значение фиксированной длины. Длина сообщения на входе может варьироваться, но длина на выходе фиксирована. Хеш-функция не может быть обратимой, то есть невозможно вычислить входные данные по хеш-значению. Это означает, что хеш-функция не может быть использована для шифрования данных. Почему keccak256? Keccak256 считается высокозащищенным алгоритмом хеширования. Он устойчив к различным типам атак, таким как атаки на предварительный образ, атаки на коллизии и атаки на увеличение длины. При этом, он является одним из самых эффективных алгоритмов хеширования и его поддерживает множество библиотек. По этим причинам,он был выбран для использования в таких блокчейнах как Ethereum и Bitcoin для выполнения различных задач. Keccak256 в Solidity keccak256 — это функция, встроенная в Solidity. Она принимает любое количество входных данных и преобразует их в уникальный 32-байтовый хеш (32 байта это как раз 256 бит).
pragma solidity 0.8.20;
 
contract Hash {
    function hash(string memory _text, uint256 _number, address _address) public pure returns (bytes32) {
        return keccak256(abi.encodePacked(_text, _number, _address));
    }
}

В смарт-контрактах функция keccak256() используется для работы с подписями, создание хеш-таблиц (маппингов), вычисление селектора функций, работа с деревом Меркла и много другого. Полную версию статьи про keccak256 можно почитать здесь. P.S. Сегодняшний пост написан ребятами из компании MetaLamp, в рамках поста для приглашенных авторов. По ссылке вместе со статьей, вы сможете найти авторский репо от команды с другими полезными материалами по Solidity. Буду рад услышать обратную связь от участников канала по такому варианту постов. #keccak256

Возможные проблемы с EIP712 Аудитор Chinmay написал небольшой пост на Medium, где поделился своей информацией с примерами о проблемах, которые могут возникнуть с подписями стандарта EIP712.  Chinmay - активный участник конкурсных аудитов на code4rena, sherlock и codehawks, поэтому к его посту стоит как минимум присмотреться. Вкратце, он описывает следующие проблемные зоны: 1. Использование не правильного адреса контракта в Domain Separator; 2. Данные в подписываемом сообщении должны быть уникальными; 3. Domain Separator должен пересчитываться, когда имя\версия меняются; 4. Риск Signature Replay в случае хардфорка; 5. Не следование спецификации стандарта EIP712; Более подробно об этом можно прочитать тут: Auditor’s Digest : The risks of EIP712 Вообще, практически в каждом проекте на конкурсных аудитах, пользователи находили хотя бы одну проблему с подписями. Перед реализацией EIP712 в своем проекте, думаю, стоит дополнительно проводить изучение не только самого стандарта, но и уязвимостей, которые были найдены из-за его не правильного использования. #eip712

UPD. Мини биржа канала Добавил еще 6 профессионалов, к которым вы можете обращаться за помощью в написании, тестировании и аудите смарт контрактов. Более того, есть те, что смогут написать для вашего протокола сайт или приложение (ключ: фронтенд), или же дать частный урок по вопросам Solidity! Приятно, что инициативу с биржей поддерживает все больше людей! #market

Создание хуков в Uniswap v4 С момента выхода v4 прошло уже некоторое время, но до сих пор я не встречал его активного применения в протоколах или конкурсных аудитах. Большинство все также сидит на v3, или даже на v2. Тут попалась статья, где подробно рассказывается о том, как работать с хуками в v4: что это, как работает и как подключить к своему проекту. Подробный разбор на канале пока не вижу смысла делать, так что, кто хочет может прочитать статью самостоятельно. Более того, там есть репо, с которым вы можете потренироваться! How to ​integrate Uniswap 4 and create custom hooks Приятного изучения! #uniswap #hooks

Мини биржа канала Сегодня на канале начинает работать мини биржа, где вы можете найти исполнителя для написания, тестирования и аудита смарт контрактов. Обязательное условие Не спамить! Не просить бесплатные консультации! Когда пишите потенциальному исполнителю описывайте задачу подробно, с ожидаемым результатом и ценой, которую вы готовы заплатить. Уважайте чужое время! Ключи к услугам 1. Р - Разработка смарт-контракта 2. Т - Написание тестов для смарт-контракта 3. А - Аудит смарт-контракта 4. Ф - Фронтенд разработка (написание сайта / приложения) 5. У - Частный урок по выбранной теме Участники 1. Р, Т, А - @oyiiyo - Ссылка Стек: Java/Kotlin/Solidity/Python/TS/JS Remix/Intellij idea 2. Р, Т, А - @daandrey - Ссылка на GitHub Стек: Solidity, TON-solidity, Typescript, Javascript, Foundry (для тестов) 3. Р - @shanty345 - Ссылка на GitHub Стек: Solidity, js - тесты(Hardhat), python, IDE - Visual studio code, cursor, remix, pycharm 4. Ф - @igor_konst - Ссылка Стек: React JS/Next.js, TS/JS, Redux/RTK, React Query, ehers.js, Solidity, Node.js, Express.js, MongoDB, HTML5/CSS3 (SASS), Tailwind, Figma 5. Р, Т, А - @kalloc - Ссылка на GitHub Стек: Python, JS&TS, Elixir, Go, Rust, C, Lua, Solidity 6. Р, Т, А, Ф, У - @TRLBLD - Ссылка Стек: React/Next, WAGMI, WalletConnect, Nest (nodejs)/Zap(zig), ethers, snarkjs 7. А (топ аудитор) - @antworker - Ссылка на code4rena Стек: Solidity 8. А - @zaevlad - Ссылка на code4rena Стек: Solidity Стоимость оказания услуг оговаривается по итогам задачи. У некоторых участников есть возможность приема оплаты в криптовалюте. Как присоединиться? Вы можете заполнить форму по ссылке: https://forms.gle/ExS8fE4v95pBZvWk6 Раз в неделю будут добавляться новые участники. Еще раз, уважайте чужое время, не спамте и пишите только по делу! #market

Мини биржа на канале? Слушайте, уже достаточно давно мне в личку поступают вопросы по типу, а могу ли я написать смарт-контракт на какой-то сети, или написать тесты для протокола, или же, в последнее время, провести аудит. И я подумал, а что если в рамках канала создать некий список участников, к которым другие могут обращаться за оказанием услуги? Ну, мало ли, кому-то нужно будет срочно написать контракт, а вы будете свободны в это время, да и дополнительный доход тоже будет кстати. Я соберу ваши контакты и закреплю в посте на канале. Кому интересно, можете заполнить форму ниже. Потребуется рассказать о вашем стеке, дать ссылки, ник в телеге и указать примерную стоимость работ. https://forms.gle/ExS8fE4v95pBZvWk6 Не знаю, к чему все это приведет, но попробовать стоит! #freelance

Frontrun и sandwitch attacks Ранее я пропустил выход этих видео от аудитора Owen Thurm на его ютуб канале, но посмотрел на выходных и решил поделиться на канале. Он рассказывает про две популярные атаки: фронтран и сэндвич, в довольно понятном ключе и с примерами. Опытные пользователи вряд ли найдут тут что-то новое, а вот для новичков будет вполне полезно. Front-Running Attacks Sandwich Attacks Кстати, вы можете включать перевод субтитров с английского на русский. В принципе, смотреть можно, хоть и займет чуть больше времени. Приятного просмотра! #frontrun #sandwith

Работа с процентами В завершении второго модуля курса был большой практикум, где в одном из заданий требовалось понимание работы с процентами при математических операциях. И поступило несколько вопросов про то, как это лучше реализовать. Я посмотрел на канале и понял, что также не поднимал этот вопрос тут. Поэтому по возвращению из поездки на выходных, решил написать этот пост с небольшим разбором. Как мы знаем, в Solidity вообще большие проблемы с математикой, в частности, с делением. А для того, чтобы посчитать 10% от какого-либо числа нужна именно эта операция. Из школьных лет мы можем вспомнить, чтобы получить процент от числа нужно: 100 шариков - 100 % ——————- ———- ? шариков - 10 % 100 * 10 / 100 = 10 шариков вроде как, перемножаем крест-накрест. В Solidity, в самой популярной реализации, примерно также, с одним уточнением. Я часто в аудитах видел, что вводится некое понятие BasisPoints и приравнивается к 10 000. uint256 constant public BASIS_POINTS = 10000; Также можно встретить названия bps или просто bp. Вот эти 10000, по своей сути, равны 100,00%. Два нуля после запятой сделаны для работы с более мелкими процентами, типа 1,85%. И для того, чтобы получить 2,75% от общего количества токенов делают примерно так: (tokenAmount * 275) / BASIS_POINTS; При этом для дополнительной точности вычисления значений порой допускают другие операции, типа округление вверх или вниз. Я встречал еще не очень популярные библиотеки (часто написанные разработчиками для какого-то конкретного протокола), но вариант с bps, наверное, самый популярный. А вы знаете еще какие-нибудь варианты работы с процентами? #math #percentage

Block Stuffing атака Смотрел старые ветки в Твиттере и встретил упоминание про атаку Block Stuffing, о которой я еще не писал на канале. Block Stuffing - это такая атака, когда хакер сабмитит огромное количество своих транзакций в блок, стараясь полностью заполнить его, и таким образом мешая другим транзакциям исполнится. Возьмем к примеру сеть Avalanche с токеном AVAX. Gas limit в блоке составляет примерно 15 млн, а стоимость транзакции обычного трансфера ERC20 токена около 0,0075 $. Такая низкая стоимость открывает двери к нашей атаке: чтобы заполнить целый блок в сети потребуется всего лишь 5,5$ (или около того, в зависимости от стоимости газа на тот момент). Таким образом всего за небольшую сумму хакер может держать нужную ему транзакцию не исполненной продолжительное время. Или же, например, мешать Chainlink data feed получать актуальную информацию по токенам в каком-то конкретном протоколе (data feeds обновляется примерно раз в 10-20 блоков, и ожидание для defi протокола может стоить хороших денег). Чуть больше об этой атаке можно прочитать тут или тут. P.S. Я редко видел в аудиторских отчетах упоминание этой атаки, так что может она не такая уж и важная? Или недооценённая... #blockstuffing #stuff

Проблема с approve для USDT Некоторые продвинутые разработчики знают о проблеме с функцией approve() для некоторых токенов, например, USDT. Загвоздка заключается в том, что нельзя изменить allowance через approve без его предварительного обнуления. Например, если один пользователь дал разрешение другому на перевод 100 его токенов, то потом вы не сможете обновить это значение до, скажем, 50 токенов. Нужно будет сначала отправить транзакцию с обнулением разрешения, а затем выдать новое на 50 токенов. Примерно в августе вышло обновление в библиотеке Open Zeppelin, где представили функцию forceApprove(), которая решает эту проблему. Она выглядит так: function forceApprove(IERC20 token, address spender, uint256 value) internal {    bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));     if (!_callOptionalReturnBool(token, approvalCall)) {         _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));         _callOptionalReturn(token, approvalCall);     } } Интересно, какие проблему аудиторы будут находить с этим обнослением? И будут ли? #approve #erc20

Solidity. Смарт контракты и аудит - Telegram 频道 @solidityset 的统计与分析