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

Наконец-то, на канале Ильи на ютуб вышел ролик про ZK (Zero Knowledge). Это достаточно горячая тема в зарубежных постах и обсуждениях.

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

Тем не менее, для тех, кто вообще не имеет представление, что это такое, данное видео прекрасно проливает свет. 

Видео урок от Ильи.

Презентация из урока.

Ссылка на сборник материалов от Officer CIA.

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

#zk #zeroknowledge
🔥3👍1
Мой личный затык с аудитами

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

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

В задачах просто: есть функция - есть уязвимость. В двух-трех контрактах тоже можно найти связи и понять flow (не знаю, как перевести общий смысл "потока" транзакций между контрактами). Но порой в конкурсных проектах я просто не могу "въехать" в описание проекта и перекликание контрактов.

В том смысле, что: "А какой контракт главный? Почему функции одинаковые? Где точка входа пользователя? Как связаны эти два контракта, которые даже в наследованиях никак не перекликаются?" и много других подобных вопросов.

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

В особенности, когда кажется, что функция уязвима. А может это так и надо? А может она по смыслу где-то защищена...

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

Пока что из 12 конкурсных аудитов, что я брал на code4rena и sherlock, 5 я пропустил. 2 из них были слишком сложные для меня пока что - Optimism и какой-то финансовый, а 2 - с ужасными доками и комментами, еще 1 - пробить не смог...

Запомните сами и передайте другим разработчикам: ДЕЛАЙТЕ КОММЕНТАРИИ! Я бы даже сказал: хреновые доки - хреновый аудит.

Фух, выговорился)

А так, принимаю советы и рекомендации из вашего опыта.

#audit
👍1🤔1
Читаем отчеты вместе. 12

Сегодня мы посмотрим на последний аудиторский отчет от Mixbytes.

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

Читаем отчет вместе!

#report #audit
🔥3👍1
Релиз Solidity 0.8.18

Если вы еще не в курсе, то вчера состоялся релиз новой версии Solidity 0.8.18.

Полное описание обновление можно прочитать тут.

Если говорить кратко, то основные изменения такие:

1) Упразднение selfdestruct. Теперь его не рекомендовано использовать;

2) Упразднение block.difficulty и появление block.prevrandao (и просто prevrandao в assembly);

2) Облегченная генерация байткода из кода yul;

3) Некоторая оптимизация yul, smtchecker, вместе с исправлением некоторых багов во втором;

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

#solidity
👍4
Аудит - это не скорый результат

Просто хочу поделиться с вами твитом одного из прекрасных аудиторов. Только подумайте, что в июне (7 месяцев назад от декабря), от только начал делать конкурсные аудиты на популярных площадках. Т.е. учился он безопасности и уязвимостям еще пару месяцев до этого! Я где-то встречал, возможно в интервью с ним, что первый баг с tx.origin он нашел еще год-полтора назад!

И при всем при этом, он еще не достиг топового уровня, как например аудитор и white hat hacker - Trust. К чему я это все?

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

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

#pashov
👍61
Читаем отчеты вместе. 13

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

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

Ну, а пока, по традиции на вечер, мы посмотрим но недавно выпущенный отчет от code4rena.

Читаем вместе!

#report #audit
Новые уроки по Foundry

Вчера на Дискорд сервере Spearbit прошел небольшой вебинар по Foundry. Я не успел попасть на эфир, но они выложили видео на ютуб канал.

Предлагаю вам посмотреть два видео от данного спикера. Первое было записано 10 месяцев назад.

How to Foundry with Brock Elmore

How to Foundry 2.0: Brock Elmore

Всего около 3 часов полезной информации. Приятного просмотра.

#foundry
Гайд по изучению Uniswap. Часть 1

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

Хочу обратить внимание, что в подборке не рассматриваются следующие темы:

1) Арбитраж;
2) Подключение функций Uniswap в свой контракт. По этому вопросу есть масса видео на ютуб;
3) Разбора математических расчетов. Я вряд ли смогу объяснить каждую формулу, поэтому лучше сами посмотрите их в документации.

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

Итак, приступим.

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

Uniswap V1

Есть три прекрасные статьи на русском языке на Хабре, где переведено создание аналога V1. Очень хорошо объяснены и показаны основные функции и их работа.

Статья 1, статья 2, статья 3.

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

Далее переходим к Uniswap v2

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

Статья 1, статья 2, статья 3, статья 4.

Если данной информации, по каким-либо причинам будет мало, то остальные вопросы можно вполне себе найти в официальной документации.

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

P.S. Отдельное спасибо @arsln_galimov за то, что поделился ссылками на данные статьи.

#uniswap
👍32🔥1
Гайд по изучению Uniswap. Часть 2

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

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

Там мы увидим, что проект, в своей сути, разделен на два репозитория:

Uniswap v3 Core
и
Uniswap v3 Periphery

Core, как мы может догадаться, исполняет основную логику протокола - создание пулов (пар). Periphery используется как посредник между фронтендом, их сайтом, где проходят все манипуляции, и core контрактами. Более того, мы можем подключать функции и делать свапы в своих контрактах, используя именно периферийные контракты.

Для изучения работы протокола можно обращаться к его официальной документации или стороннему проекту, где описана вся его логика с примерами - Uniswap V3 Development Book.

Есть три видео, в которых авторы проходятся построчно в таких контрактах, как Position, Factory и делают общий обзор.

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

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

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

Вообще, tick - это некий диапазон цен, в котором находится токен для покупки или продажи. И пул, например, WETH/DAI, может иметь множество таких ticks.

Вот здесь можно почитать подробнее про оба этих принципа.

Статья 1, статья 2.

Ну, еще мне понравилась эта картинка для демонстрации.

Также, в процессе изучения ticks вы встретитесь с такими "монстрами", как tickSpacing и tick bitmap. В первом случае, это некий параметр для более эффективной итерации по тикам, во втором - специальная техника для индексации данных в компактном виде. Почитать подробнее можно в этих постах:

Про tickSpacing, иллюстрация tickSpacing, про tick bitmap.

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

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

Описание quoter контракта, которые помогает рассчитывать цены токенов на фронтенде, а также Multihop Swaps, которые помогают обменивать один токен на максимально возможное количество другого.

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

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

#uniswap
👍3🔥1
Немного о комментариях к коду

Я хочу еще раз поднять тему комментирования кода в процессе разработки и для проведения аудита.

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

@noscript - заголовок
@author - автор кода
@notice -заметка о коде
@dev - пометка от разработчика
@param - описание параметров функции
@return - описание возвращаемой переменной

Как их использовать?

Например у нас есть простая функция:

functions example(uint256 amount, address receiver) external returs (uint128) {}

Ее описание может быть таким:

/*
*
*
@noscript - кто написал эту функцию (разработчик);
*
@noscript - что она должна делать?
*
@notice - более детальное описание функции (можно на нескольких строках);
* @dev - пометка для других разработчиков;
*
@param - amount отвечает за это...
*
@param - receiver отвечает за это...
*
@return - uint128 должна вернуть это...
*
*/

Такое описание должно быть практически для каждой функции в контракте. Для импортов и наследований достаточно оставлять @notice.

Для проведения аудита крайне рекомендую скачать приложение для VS Code - Inline Bookmarks от tintinweb, которое позволяет делать теговые заметки:

/*
*
*
@audit - общие заметки по аудиту;
*
@audit-info - дополнительная информация;
*
@audit-issue - найденная уязвимость или проблема;
*
@audit-ok - проверено и все ок;
*
*/

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

Ставьте комментарии и теги.

#natspec #comments
👍3
Читаем отчеты вместе. 14

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

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

Читаем отчет вместе!

#report #audit
Большой задачник данного канала

Собрал все задачи и CTF, которые когда-либо появлялись на канале, в один пост.

Сохраните этот пост к себе в Избранное и проходите их в своем темпе.


Задачи канала


Задача 1Задача 2Задача 3

Задача 4Задача 5

Задача 6 Задача 7Задача 8

Задача 9Задача 10

Задача 11Задача 12Задача 13Задача 14Задача 15

Задача 16Задача 17Задача 18Задача 19Задача 20

Задача 21Задача 22Задача 23Задача 24Задача 25

Задача 26Задача 27

Задача28Задача 29Задача 30 -- Задача 31Задача 32

P.S. Для некоторых задач решение находится сразу за скрином следующим постом.


Популярные и не только CTF


Capture the EtherThe EthernautCryptoZombiesDamn Vulnerable DeFi

DeFiHackCryptoHackEtherHackCipher Shastra

Speedrun EthereumCTF Blockchain ChallengesMr Steal Yo Crypto

CTF ProtocolQuillCTF


CTF для практики Foundry


Damn Vulnerable DeFiFifty years Capture the EtherEthernaut CTF

DeFiHackLabs -- DeFiVulnLabs

Подборка уязвимостей


Hight riskMedium RiskAll the rest


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

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

#ctf #task
🔥9👍2
Ретроспектива материалов на канале

Привет всем новым участникам канала! Надеюсь здесь вы найдете много новой и полезной для себя информации!

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

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


Безопасность


Уязвимости с прокси контрактами

Кратко о Beacon Proxy

Проблемы контракта USDT

Защита от атак Signature Replay

Новые уязвимости? (5 постов)

Double Entry Point

Signature Malleability (2 поста)

Read-only-reentrancy

Манипуляции  с block.timestamp

Опасность с approve токена


Foundry


Изучаем Foundry

Чуть больше о Foundry

Тесты с Foundry (6 постов)

Прочитать mapping в Foundry

Про внешние контракты в Foundry

Минт токенов в Foundry

Новые уроки по Foundry


Скамы


Возможные скамы с NFT (5 постов)

Возможные скамы с токенами ERC20

Новый скам в NFT


Остальное


Как создать адрес в сети Эфир на js

Как создать подписанное сообщение?

Проблемный create2

Не принятый create3

Разбор байткода, opcodes, деплой

Пример работы Frontrun ботов

Интересный нюанс с call вызовом

Хэширование в EIP712

Как стать web3 разработчиком? (4 поста)

Чуть больше о Yul (assembly)

Как читать calldata?

Правило 1/64

Solidity полон сюрпризов

Особенность try/catch

Собрание подсказок по газу

Gatekeeper Three от Ethernaut

ABI Smuggling от Damn Vulnerable DeFi

Немного о Zero Knowledge

Немного о комментариях к коду

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

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

#all
14👍6🔥1👏1
Привет всем новым участникам

За последние два дня на канал пришло какое-то невероятное количество новеньких, примерно +100 человек! Большое спасибо @arsln_galimov и @MaxWayld за упоминание и репост на своих каналах!

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

При этом хочу обозначить некоторые моменты про данный канал:

1) Тут не учат играть на биржах и не постят новости о крипте;
2) Тут не научат делать ботов и фронтранить мемпул;
3) Тут не учат фронтенду и ethers.js;

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

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

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

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

Добро пожаловать и приятного обучения!

#intro
👍173
Задача 33

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

Ну, а пока, достаточно сложная задача с двумя уязвимостями. Сможете найти их?

Решение

Во-первых, из-за работы функции с memory, само состояние маппинга не будет обновлено, более того при работе с callback вызовом, в данном случае, возможна DoS атака. 

#task
👍61🔥1
Задача 34

Эта задача была помечена как Med Risk на code4rena.

Порой мне кажется, что подобные случаи 1 на 1000, а то и больше. Ну, какая-то слишком простая ошибка.

Решение

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

#task
7
Задача 35

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

Решение

Разработчики забыли добавить модификатор к функции, из-за этого пользователи могут забирать токены в любое время.

#task
1👍1
Задача 36

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

Решение

Проблема кроется в переводе uint256 amount в uint160, из-за чего транзакция может откатиться. В этом случае лучше использовать сторонние библиотеки, типа safeCast.

#task
4
Задача 37

И последняя на сегодня, снова же от Immunefi. Как подсказка: внимание на комментарий в коде!

Решение

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

#task
👍51
Чтение слотов памяти в контрактах

Вчера наткнулся на интересный сервис для чтения слотов памяти в уже задеплоенных контрактах. Достаточно скопировать адрес с etherscan и ввести номер необходимого слота. Также программа работает и с EIP-1967 (прокси).

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

Проект Query Storage Slot.

Смотрим и применяем!

#storage #slot
5👍4
Немного о EIP-1967

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

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

Особенностью данного стандарта является необычный расчет слота памяти. Если в обычной реализации формула:

bytes32(uint256(keccak256("eip1967.proxy.admin")))

то в EIP1967 она такая:

bytes32(uint256(keccak256("eip1967.proxy.admin")) -1 )

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

Preimage атака заключатся в том, чтобы найти изначальное "сообщение", которое было зашифровано одним из криптографических  способов (например, keccak или sha).

Больше о EIP-1967 можно почитать в обсуждениях на GitHub.

Я буду добавлять информацию об этом стандарте по мере работы с ним. Все будет также доступно по тегу #eip1967.

#eip1967
4👍3