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

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

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

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

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

4. Создайте один NFT с возможностью передачи его один раз в 24 часа. Если пользователь не успевает его передать в течение этого времени, то NFT остается у него навсегда.

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

#практика #идеи
👍1
Идеи проектов для тренировки. Часть 2

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

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

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

Кстати, в этом видео уже разбирались некоторые задачи из ethernaut.

Damn Vulnerable DeFi - еще один крутой проект для поиска уязвимостей. Я встречал в нескольких видео рекомендации о нем. Работает так же: выбираете задание, читаете условие и выполняете его.

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

Блог Trail if Bits - англоязычный блог от создателей таких крутых сервисов для аудита смарт контрактов, как Slither, Manticore, Mythril и других. Пишут о новых уязвимостях.

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

#практика #идеи #безопасность
Поиск работы. Часть 1

Прежде всего хочу уточнить два простых моменты про поиск работы в сфере блокчейна:

1. НЕ ищите работу в русскоговорящих странах. Объясню почему. Во-первых, просмотрев несколько вакансий на популярных сайтах, типа хх, я был крайне удивлен требованиям и зарплате. При том, что вам нужно будет знать "все, кроме блокчейна", так еще и зарплату предлагают на уровне 100к. С большой вероятностью, вы получите больше геморроя, чем практики. Во-вторых, отставание по технологиям. Создание NFT и токенов - это малая часть работы в блокчейне. Если хотите стать спецом, то нужно искать другую практику.

2. Курсы НЕ устроят на работу. Я видел кучу объявлений от топовых компаний по типу "Пройди курс и получи работу 100%". Это все дикая хрень. Во-первых, там мало чему научат с практической точки зрения, так еще и работу подберут, как из первого пункта.

Чтобы получить работу, нужно также всего две вещи:

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

2. Портфолио. Сделайте 3-4 проекта, которые сможете показать. Подойдут даже самые простые. Не требуется создавать новый Uniswap, претендуя на свою первую работу, как блокчейн разработчик.

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

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

#работа
👍4👏2
Поиск работы. Часть 2

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

1. Indeed - блогеры на Youtube советуют именно его.

2. Cryptocurrencyjobs - много вакансий в web3 связанных не только с кодингом.

3. Cryptojobslist - еще один популярный ресурс, также есть поиск работы для новичков.

4. Web3.career - интересный проект, хотя у меня вызвала вопросы актуальность некоторых вакансий.

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

6. Beincrypto - еще один сайт, где можно найти работу не только с кодингом.

7. Glassdoor - странный немного по дизайну сайт, но вакансии актуальные.

Дальше только ссылки.

8. Dice

9. Blockchain.works-hub

10. Также можно искать вакансии в компаниях, которые вам приглянулись, например, в Binance, Uniswap, Coinbase.

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

Помните, вам нужно составить резюме перед тем, как подавать заявки на вакансию.

#работа
👍31
Обзор пройденного

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


Безопасность и аудит смарт контрактов

1. Подготовка смарт контракта к аудиту

2. Что такое NatSpec в смарт контракте?

3. Проведение аудита

4. Тестирование контрактов в Slither

5. Тестирование с Mythril и Manticore

6. Smart Contract Security Verification Standard


Вопросы безопасности

7. Безопасность. Внешние вызовы (5 частей)


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

8. Атаки reentrancy и DoS

9. Атаки honeypot, delegatecall и oracle manipulation

10. Атака frontrunning (опережение)

11. Атака timestamp dependence / time manipulation

12. Атака Arithmetic

13. Атака Short Address

14. Атака force feeding

15. Атака griefing


Практика

16. Создание soulbound NFT (4 части)

17. Пишем мини краудфандинг и разбираем код

18. Идеи проектов для тренировки (2 части)


Другое

19. Сдвиги / смещение

20. Hardhat network helpers


Поиск работы

21. Поиск работы (2 части)


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

Приятного обучения.
👍4
Темы для разбора от участников?

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

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

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

Единственное что, вопросы должны быть по Solidity и блокчейн разработке, а не игре на биржах, арбитраж, и т.д.

Что думаете?

Приятного дня!
👍1
Вопросов нет, будут пока новости

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

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

Например, вы знали, что недавно Метамаск запустил в бета свой SDK. Другими словами, если раньше мы использовали ethers.js или web3.js для подключения кошелька и проведения транзакций, то теперь это можно будет делать напрямую из Метамаск.

Чуть больше об этом можно прочитать тут.

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

Приятного дня и легкого обучения.
Новый сайт для поиска работы

Сейчас встретил новый сайт, где размещаются вакансии в web3. И не только для разработчиков.

https://aworker.io/

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

Попробуйте, может кому зайдет.

#работа
👍3
Временно курс на безопасность

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

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

Что значит "посты про безопасность и аудит"?

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

Во-вторых, разобрать примеры с ethernaut и Damn Vulnerable DeFi.

В-третьих, поискать информацию по последним взломам, и понять как они происходили.

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

Надеюсь, новый курс будет вам интересен также как и мне.

Приятного дня и легкого обучения!
👍5
Планы на неделю

Привет всем! Начинаем неделю обучения безопасности.

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

Посмотреть roadmap можно тут.

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

Итак, что же будет на этой неделе?

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

Каждый день мы будем разбирать несколько задач ethernaut (1-5 в зависимости от сложности), а также я буду делать несколько постов с заметками по безопасности, которые найду в статьях.

Другими словами, сначала мы пройдем ethernaut, потом DVD, потом будет разбирать другие известные уязвимости (в registry и новостях), затем, я надеюсь, что смогу разобраться с программами аудита и рассказать о них. В конце, посмотрим, чего не хватило, и дополним программу. Вместе с этим, как я уже написал, будут заметки по безопасности из статей.

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

Начнем с ethernaut.

Приятного дня и легкого обучения!
👍4
Немного о работе с Ethernaut

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

В посте будет задание, ссылка на контракт и разбор решения.

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

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

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

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

Надеюсь, вы поняли мою идею. С ethernaut мы научимся прицельно смотреть на код, а с остальными задачами в других проектах - уже практиковаться самим.
👍1
Ethernaut. Задача 1. Fallback

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

Решение

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

В чем суть?

В конструкторе определяется владелец контракта и ему начисляется 1000 Эфира.  Далее есть функция contribute(), которая позволяет любому участнику делать взносы больше 0.001 Эфира, и если сумма взноса превышает сумму владельца, то права ownership переходят совершившему взнос участнику.

Также есть fallback функция receive(), которая говорит принимает деньги, если они просто пришли на контракт. Там проверяется, есть ли такой участник в системе (вносил ли он ранее деньги) и сумма, которая должна быть больше 0. Если условия прошли, то участнику автоматически передаются права ownership.

Поэтому, чтобы решить задачу нам нужно, чтобы эти условия в receive() были выполнены: мы внесли сумму ранее и прислали деньги через fallback потом.

В Ремикс нужно выбрать другой адрес пользователя, вызвать функцию contribute(), чтобы появилась запись о нас в системе, а затем прислать деньги через Transact.

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

#ethernaut
👍3
Ethernaut. Задача 2. Fallout

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

Задача не актуальная после выхода версии Solidity 0.8.

В чем суть?

Ранее, до версии 0.8.0, не существовало функции constructor, и она заменялась другой функцией с именем, как у контракта.

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

#ethernaut
👍2
Ethernaut. Задача 3. Coin flip

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

В чем суть?

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

Однако в Solidity большие проблемы со случайными числами, особенно теми, которые основаны на block.number.

Мы можем написать свой контракт, который будет предугадывать сторону. Как раз за счет block.number и проведения транзакции в одном блоке, мы сможем предсказать сторону.

Простой контракт может выглядеть так:

contract Hack {
   using SafeMath for uint256;
  uint256 FACTOR = 57896044618658097711785492504343953926634992332820282019728792003956564819968;
  function hack (CoinFlip _flip) external{
     uint256 blockValue = uint256(blockhash(block.number.sub(1)));
     uint256 coinFlip = blockValue.div(FACTOR);
    bool side = coinFlip == 1 ? true : false;
    _flip.flip(side);
  }
}

В общем, никогда не создавайте случайные числа, используя средства Solidity и block.number. Для этого лучше подключать сторонние сервисы, типа Chainlink VRF.

#ethernaut
👍2
Ethernaut. Задача 4. Telephone

В этой задаче нам нужно стать владельцем контракта.
Ссылка на задачу

В чем суть?

tx. origin - это такая штука, которую никогда не стоит использовать в своих смарт контрактах, если не понимаешь зачем. А лучше не использовать ее, даже если понимаешь зачем.

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

contract Hack {
  function hack (Telephone _tel) external {
    _tel.changeOwner(0x617F2E2fD72FD9D5503197092aC168c91465E7f2);
  }
}

Получает так: мы, являемся tx.origin, через наш контракт, который является msg.sender, отправляем запрос в Telephone и вызываем функцию changeOwner(). И так как функция вызывается не нами (нашим адресом) напрямую, а нашим контрактом, то мы становимся новым владельцем.

tx.origin отстой - не используй его. Я встречал информацию, что в последующих версиях Solidity tx будет упразднен.

#ethernaut
👍1
Ethernaut. Задача 5. Token

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

В чем суть?

Задача также не актуальна для версии старше 0.8, так как тут уже есть защита от overflow и underflow.

Проблема была в том, что попытавшись перевести больше 20 токенов, которые есть на счету, система переходила в overflow и сумма получался перевод около ~250 токенов. Однако в 0.8 теперь такая операция будет выдавать ошибку, если нет unchecked.

#ethernaut
👍2
Подсказки по безопасности - 1

Постепенно я буду разбирать файлы из приведенного выше roadmap и делать посты с подсказками по безопасности.

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

Подсказка 1

Токены, у которых decimals больше 18, могут стать проблемой.

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

#security #tip #st
👍1
Ethernaut. Задача 6. Delegation

В этой задаче нам нужно стать владельцем контракта.
Ссылка на задачу

В чем суть?

Тут нужно знать о работе delegatecall, fallback и низкоуровневых вызовах, и тогда задача кажется простой.

Функция fallback вызывается тогда, когда с другого контракта пришла транзакция, которая пытается вызвать функцию, которой нет в данном контракте. А delegatecall выполняет функцию стороннего контракта в рамках своего же контракта. Звучит запутано, но на практике все проще:

Мы создаем свой хакерский контракт, через низкоуровневый вызов пытаемся запустить функцию pwn() в Delegation. Но так как там нет такой функции, вызов попадает в fallback, и уже там, в рамках delegatecall и вызывается pwn() из Delegate , которая отдает нам права владельца.

Самый простой хакерский контракт может выглядеть так:

contract Hack {
function hack (address _deleg) external {
_deleg.call(abi.encodeWithSignature("pwn()"));
}
}

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

#ethernaut
👍1
Ethernaut. Задача 7. Force

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

В чем суть?

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

1) Это перечисление награды за майнинг;
2) Вызов selfdestruct;

Вот простой пример контракта хакера:

contract Hack {
  function destroy (address payable destr) external {
    selfdestruct(destr);
  }
  receive() external payable{}
}

Он вызывает у себя функцию уничтожения, которая пересылает все деньги на адрес указанного контракта. receive() нужна для того чтобы изначально пополнить баланс нашего контракта.

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

#ethernaut
👍2
Ethernaut. Задача 8. Vault

В этой задаче нам нужно открыть сейф.
Ссылка на задачу

В чем суть?

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

Да, я знаю, что любые private переменные на самом деле можно прочитать. Для этого стоит развернуть его в локальной сети, например в hardaht, и вызвать метод ether.provider.getStorageAt(address, slot), но меня заинтересовал вопрос, а можно ли напрямую из контракта считать слоты памяти в другом контракте, например, через assembly.

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

Итак, вам нужно задеплоить контракт в тестовую сеть, передав аргументы в конструктор через [hre.ethers.utils.formatBytes32String('yourPassword')], а потом в тестах или консоли вызвать метод getStorageAt() на второй слот, так как переменная private password лежит именно там.

#ethernaut
👍2
Ethernaut. Задача 9. King

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

В чем суть?

Здесь секрет кроется в king.transfer(msg.value), т.е. в одной транзакции отправляются деньги королю, и только потом идет обновление переменных короля и баланса.

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

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

Простой код для этого:

contract Hack {
    function hack( address _king) external payable {
      _king.call{value:msg.value}("");
    }
}

Я думал, что можно решить эту задачу с selfdestruct, как в одном из примеров выше, но это не сработало. Деньги то не балансе контракта King появились, а вот переменная prize не обновилась. А все потому, что мы закинули деньги без вызова каких-либо функций, поэтому receive не сработала.

#ethernaut