How to Code или как выносить проекты на 1000 аккаунтов
Сегодня хороший день для изучения кодинга, а если "сегодня" происходит на медвежке, то это лучший день для изучения кодинга.
Если вы не хотите тратить кучу времени и денег на самостоятельное обучение, то есть решение для вас. Мы запустили совместный курс по web3 автоматизации. Следующий поток будет - 2024, март-апрель. Следить за анонсами можно в данном канале. Подпишитесь!
- Интро/кто мы/о чём статья
- Зачем учить программирование
2.1. Зачем это нужно в целом2.2. Зачем это нужно под web3 2.2.1. Профиты, выносы, деньги, тачки, тёлки
2.2.2. Adapt or Die 2.2.3. Экономия средств на платных софтах
2.2.4. Настройка и запуск паблик софтов
2.2.5. Модификация всего
2.2.6. Аудит - Что такое программирование
- Чем занимаются web3 программисты
4.1. Как работает автоматизация криптопроцессов и причём тут HTTP-запросы
4.2. Неверифицированные контракты и реверс инжиниринг аргументов транзакции - Какие ЯП подходят под web3
5.1. Python
5.2. JavaScript
5.3. Solidity
5.4. UI-автоматизация (BAS, Zennoposter)5.5. UI-автоматизиция (Selenium, Playwright, UIautomator2) - Почему Python - лучший язык для начала в web3
6.1. Что такое Python
6.2. Почему отдаём приоритет именно Python - Как учить программирование?
7.1. Общие советы
7.2. Практика - Roadmap web3 разработчика на Python
8.1. Изучение языка программирования
8.2. Методички Алекса Крюгера
8.3. Изучение web3 фреймворка
8.4. Практика
8.5. Работа с сетью и API8.6. Углубление в блокчейн
8.7. Какие использовать источники для обучения разработке
8.8. Работа с github. Поиск чужих софтов, взятие best practices
8.9. ChatGPT - Практическая часть: разбор WooFi свапа
- Заключение
Интро/кто мы/о чём статья?
На связи cryppi, и я сильно загорелся идеей погрузиться в кодинг для криптанов. Из меня погромист такой себе, благо жизнь каждый день связывает меня с очень крутыми людьми, и именно поэтому со-автором данной статьи стал талантливый человек с ником Ahillary.
Теперь немного поподробнее о нас обоих. Начнём с меня.
Я, cryppi, думаю, вы меня уже знаете, раз читаете эту статью, но для новеньких напомню - я безработный немиллионер, иногда пишу свои буковки в свой канал (23 тыщи подписчиков вообще-то) и иногда выпускаю крутые статейки для новичков и не только в крипте (в общем они собрали 500 тыщ прочитываний, что ого-го). Так вот, недавно я сильно загорелся идеей написать новую статью, обязательно ультимативного характера, но с выбором темы были проблемы - я метался от одной до другой, но как-то меня осенило - а ведь про элементарный кодинг для криптанов никто ничего нормально не делал. Да, было пару материалов, но это всё-таки не совсем то... либо сбор ссылок, либо какие-то максимально непонятные новичку вещи.
Но я не кодер, поэтому я решил обратиться к профессионалу. Передаю ему слово.
Всем привет, меня зовут Ahillary, и я разработчик. Больше 6 лет в программировании и за это время успел поработать с языками C/C++, Python, JavaScript, PHP, C#. Мой опыт позволяет мне писать быстрый и читаемый код. Но все мы любим числа, поэтому... Мой Python код для автоматизации торговли на фондовой биржи принёс более 2 млн$ чистой прибыли за год. Когда стратегия с фондой накрылась, я пришел в крипту и стал работать с сильными криптанами, так как я не особо люблю ресёрчить проекты. Помимо кодинга у меня неплохо получается преподавать, и мне нравится это дело. Я 3 года обучал людей разного возраста программированию: работал в частных организациях, целый год вёл пары в магистратуре и успешно запустил авторское обучение по web3. Короче, в коде я не последний человек :D
cryppi: "Я не силён в математике, но я увидел у одного человека следующее: "1+1=11", так вот, я думаю, что в нашем случае эта формула тоже сработала, и нам получилось написать крутую статью по кодингу в крипте для новичков"
Для кого эта статья?
Данная статья - про автоматизацию web3 процессов, грубо говоря, про софтовый мультиаккаунтинг. И в конце мы распишем роадмап, как стоит двигаться дальше.
Кому не зайдёт? Новичкам в крипте. Опытным в крипте и в кодинге.
Кому зайдёт? Новичкам в кодинге, но "неновичкам" в крипте.
Как работать с этой статьёй. Очень важно! 👇
Статья в спокойном темпе прочитывается за 90 минут, и после неё вы должны понять, хотите ли двигаться дальше в этом направлении. Стать кодером после прочтения - невозможно. Цель статьи - заинтересовать вас в кодинге. И мы даём для этого все ресурсы и наставления. В идеале растягивать эту статью на 2-3 месяца и скрупулезно изучать каждую строчку, переходить по каждой ссылке и выполнять каждый пункт из нашего роадмапа. И только после этого вы можете считаться начинающим кодером.
И помните, самое главное - иметь цель. Бездумно изучать функции, рекурсии и т.д. - это, конечно, хорошо, но абсолютно юзлесс. У кого-то цель - вынести проект. У кого-то цель - написать антидрейнер. У кого-то цель - написать ультимативный софт под Linea Квесты. Не забывайте про цель.
Если будет сложно и непонятно, то не тильтуйте. Во-первых, не всем быть кодерами. Я (криптапиражок), например, не умею кодить на хорошем уровне, но это мне и не нужно. Я просто окружил себя талантливыми людьми. Во-вторых, я уже писал, эта статья на 2-3 месяца. Что-то непонятно? Гуглите или спрашивайте по чатам.
Зачем учить программирование?
Вроде все хотят кодить, но зачем?
Не поверите, но все вещи в этом мире имеют свою причину. Желание изучать программирование - не исключение. Так вот, в этом пункте мы постараемся нагнать на вас FOMO перечислить вам объективные причины для изучения кодинга. Может, это и вовсе не ваше...
Зачем это нужно в целом?
Программирование стоит знать хотя бы на минимальном уровне, просто потому что это стандарт 21 века. Уверен, что у каждого из вас есть как минимум парочку знакомых программистов, а то и больше. Ну, думаю, тут всё понятно.
Если говорить о практической выгоде, то это:
- Экономия времени. Да, вы потратите время на изучение кода и практику, но это окупит вам сотни или тысячи часов жизни, которые вы тратите на рутинные задачи. Простейший пример: прокрутить 1000 аккаунтов в ретро - всё время, загнать софтом - пару недель на написание и немного времени на слежку за процессом. Чувствуете разницу? Работаем не руками, а головой. Сотни, тысячи, миллионы железных рабов делают четко поставленные задачи ради одной цели - накормить своего хозяина. Пример? Пример - да тот же Memeland Farm. Если вы делали 1000 аккаунтов руками, то потратили бы часов 50 на них (по минималке). А мы ещё не говорим про прохождение новых квестов и неожиданные траблы, которые заберут столько же времени. Пишете скрипт на Мемеленд, запускаете всю эту бурмалду и жёстко кайфуете. Железные рабы всё сделают за вас...
- Полезные знакомства. Если люди будут знать, что вы программист, они будут к вам приходить со своими идеями. Почти все кодеры в крипте имеют большой и постоянный поток предложений: от просто пофрилансить и написать простой код на минт NFT до какого-нибудь антидрейна (у человека на носу клейм застейканных 100 тысяч долларов, а на кошельке сидит дрейнер, к кому он обратится - к проверенному программисту)
- Стабильность. Если вы умеете программировать, вы не пропадете. Да, кодить ретрософты - это не самое нужное в этом мире, но, в любом случае, вы войдёте в кодерскую колею, улучшите свои навыки и всегда сможете пойти на высокооплачиваемый IT-завод.
- Учишься гуглить. Странный пункт, но, на самом деле, складывается ощущение, что 60-80% людей просто не умеют гуглить и считают, что их проблема уникальна и лучше потратить несколько минут жизни другого человека вместо того, чтобы правильно ввести вопрос в гугл.
- Когда ты занимаешься разработкой, то абсолютно нормально, что на новом проекте ты не будешь знать 80% из того, что там происходит, и в этот момент ты учишься гуглить и не стрессовать при виде непонятной (на первый взгляд) задачи.
- Вы будете универсальны. Код - мультипликатор заработка не только для крипты. Вы сможете автоматизировать буквально почти всё. От стим трейдинга до спама "абузим гем" в телеграм чатах. Вы станете МАШИНОЙ!
- Учишься думать по-новому. "Чтобы стать машиной, нужно думать как машина". А машины могут выполнять только простые и четкие команды. Например, есть задача "сделать чай". Человек запросто справится с такой задачей, а вот машина может налажать. Поэтому машине нужно выдать очень четкий алгоритм действий: пойти на кухню, налить воду в чайник, поставить чайник на подставку, нажать кнопку включения (перед этим еще можно проверить подключение к розетке), взять кружку, положить туда чайный пакетик, положить в кружку N ложек сахара, дождаться, когда закипит вода, залить воду в чашку, размешать сахар. Этот процесс называется "декомпозицией задачи" - один из самых главных навыков программиста. Вы станете по-другому смотреть на обычные задачи.
Зачем учить программирование под web3 автоматизацию?
Если вы крутили 50 аккаунтов под очередной ретро-проект и не могли найти время на большее количество, то программирование с легкостью решит эту проблему. Написали кодик, протестировали и идёте кайфовать, пока логи о успешных транзакциях приходят вам в телеграм бота.
“Дропы все равно умрут”. Да, они умрут. Вопрос лишь во времени. Но не стоит забывать, что есть и другая крипта. Как вы думаете, происходило взаимодействие кодеров с другими метами (ICO/IDO/NFT/Shitcoins/да, даже тот же friend tech)?
Почти всё похоже друг на друга: абсолютно всё построено на http-запросах (клиент - сервер), и поэтому если вы умеете отправлять их, то эти знания точно будут актуальны ближайшие десятки лет. Вы сможете адаптировать свои знания под любую мету. Хоть ретро, хоть P2E игруля, хоть friend tech форк, хоть снайпинг щитка. Ещё раз - знания универсальны почти под всё.
Первая причина и самая главная...
Все мы хотим кушать.
Иногда мозг понимает только язык FOMO. Сейчас попробуем пообщаться исключительно на нём.
- PVU. Думаю, олды вспомнят. Сам фарм P2E игрулек давал неплохие деньги, но здравые пацанчики умудрялись писать софты под них и PVU в том числе. Выносить 1,000-2,000 долларов чистыми в день на максимально простом софте - легчайше. Были истории как эта, когда при написании софта находились некоторые баги. Если очень вкратце, то PVU считала два разных написания одного адреса за разные аккаунты, например:
- 0x0a34a5565e952ab27787a21a3f4e54b321ac0340
- 0x0A34A5565E952aB27787A21a3f4E54b321AC0340
- И на один кошелёк можно было получать награды неограниченное количество раз. Пташки нашептали, что за день получалось забирать 200 долларов с аккаунта. А что если это 100, 200, 300, 1000 акков?
- Смогли бы вы найти этот баг, не будучи кодером? Вопрос риторический.
- Выносы паблик сейлов NFT-проектов. Тоже олдовская история. Думаю, вы все помните, как содрогалось комьюнити после каждого выноса NFT-сейла Тёрном. Многие ловили дичайшее фомо после того, как одной транзой на паблик сейле выкупалась половина саплая коллекции и сливалась с дичайшим профитом. NFT-проекты всегда славились своими дырявыми контрактами, и люди пользовались этим. tern, user221, RIGHTBLOCK, eslam, Nifoleko - вот они легенды... Не буду перечислять примеры, их было просто много. С каждого выноса оформлялись сотни тысяч долларов. Ретроспективно это кажется довольно легко. Но на бычьем рынке просто не было времени на изучение всех тонкостей работы блокчейна и газа. Так что сейчас - идеальный рынок для этого.
- Murakami Flowers. Показательный пример, на самом деле. Если вкратце, парень написал простой софт на пайтоне, который загнал 130,000 аккаунтов в рафл NFT-сейла Murakami Flowers. Он выиграл 923 мест. Если что это 6,400 ETH (18 миллионов баксов) профита на тот момент. Рекомендую полностью изучить этот кейс. Не факт, что он вообще реален, но он очень хорошо показывает, что даже простейшими скриптами можно выносить очень большие деньги. Смог бы этот парень загнать руками 130,000 аккаунтов в рафл? Вопрос риторический.
- Friend Tech. Не поверите, но даже на таком рынке можно делать деньги, сотни долларов, тысячи, сотни тысяч... Этот парень впервые увидел питон, взял у знакомого 60 баксов на старт и апнул с них портфель в 40,000 баксов. В чём заключалась логика скрипта? Он снайпил "недооцененные" акции на самом старте, они пампились, человек становился чуть богаче. Вот и всё.
- Помимо этого кейса было/есть много кейсов, когда мои знакомые апали свой банк с помощью различных кейсов на Friend Tech: в самом начале хайпа вашу акцию, даже если у вас нулёвый Твиттер, пампили до некоторой суммы (допустим, 30-50 у.е.) за пару минут, вы с пару у.е. центов вложений делали 30-50 у.е., и вы могли спокойно автоматизировать этот процесс создания - покупки - слива акции.
- Stars Arena. Форк т.н. Friend Tech. Тут история не про ультимативное богатство, а больше про сам кейс. Эти парнем была найдена некоторая уязвимость в этом проекте. Если вкратце, за продажу воздуха (0 акций) ты получал некоторую сумму. Буквально бесплатные деньги. И это было возможно благодаря багу в контракте. Сам парень ничего с этого не вынес. А вот какие-то "негодяи" вывели, благодаря этому 3 миллиона долларов ликвы из проекта.
Код усиливает вашу техническую насмотренность, и вы находите те самые штуки, которые обычный абузер никогда не обнаружит. И это не про взломы контрактов, а про оптимизацию процессов, поиск лучших путей для выполнения тех или иных задач и whitehat. - Ретродропы. Ну, извиняйте, без простейших примеров мы не можем обойтись.
- Арбитрум - нашли любой паблик софт, отредачили его под себя, или же написали простенький свой, прогнали 1000 акков с вложениями 500-1000 баксов, залутали дроп на все акки, получили свой консервативный миллион долларов Hashflow, где за любую транзу давали 33 токена (15 баксов) дропа, Aptos, где за минт NFT и привязку дискорда давали 150 токенов (1000 баксов), Arbitrum Odyssey, где за простейшие задания давали NFT стоимостью 15-20 баксов - всё это проекты, где автоматизация была простейшей, и в них можно было загнать десятки, сотни, тысячи аккаунтов. Да, есть куча проектов, где вы могли закодить, но не получить ничего. Но это же не значит, что не стоить учить код? Важно не как, а что кодить.
- А под конец дадим слово нашему единомышленнику из чата (орфография и пунктуация сохранены):
Если без рофлов, когда все писал что темок на медвежки нет, я каждый день видел темку под которую можно закодить бота и поднять $.
Свой лайфчендж я сделал на медвежке, только благодаря тому что я кодер.
Даже раньше, до крипты, когда просто занимаешься какими-то темками я думал "блин, какая код крутая штука его должны преподавать в шк. любой человек, который находятся в сфере темщиков должен знать Python ибо он ускоряет тебя в 10 раз".
Каждый раз когда люди находят какую-то темку, они думают как изебнутся что бы сделать что-то (например скачать 100 видео с ютюб, им приходится искать бесплатные недо-софты), я же пишу софт и
скачиваю 1000 видео, при этом мой софт сортирует их на нужные категории, сразу грузит куда надо и получает деньги - я уже быстрее большинства.
Или когда люди находят топ темку, но все пишут тяжело сидеть и ручками содержать ферму в 100 акков в итоге лутают копейки или забивают, а я пишу бота и выношу в 10 раз больше.
Благодаря коду можно находить способы сократить расходы или обойти "систему" (Например в одной темки нужны были номера usa, на номера смс сервисов не приходил код, проходили только реальные. Но вот прикол они проверяли смс код только на фронте, а на сервере нет, поэтому мне удалось зарегать дохера акков без номера).
Кроме того благодаря коду мне удавалось находить 2 дрейнера и не потерять деньги.
Еще многие кодеров считают богами/гениями
Adapt or Die
Код - это ярчайший пример "Adapt or Die". Можно вечно ныть, что все начали крутить аккаунты софтом, многие начали продавать лопаты, да и в принципе очень много людей погрузились в автоматизацию.
Ваш скептицизм понятен, такое было всегда. Это можно описать одним словом - луддизм. Что это? Поясняю, в каких-то там годах (18 или 19 век) парни-работяги решили побыковать на.... машины и заводы, которые, отбирали у них рабочие места в ходе промышленной революции, и просто их разносили (и в прямом и переносном смысле). Чувствуете похожие вайбы?
Луддиты - участники стихийных протестов первой четверти XIX века против внедрения машин в ходе промышленной революции в Англии. С точки зрения луддитов, машины вытесняли из производства людей, что приводило к технологической безработице.
И очень важно понимать. Софт - это не обязательно 10000 аккаунтов. Можно написать софт для прогона всех активностей на своих 10 аккаунтах. Даже на таком количестве аккаунтов самописный софт поможет вам избежать скучнейшей рутины и сэкономит вам кучу нервов, времени и денег (!), которые вы сможете направить на более полезные вещи (написание другого софта?)
Есть шанс через пару лет (на бычке) неприятно для себя осознать, что вы сегодня (да, да, именно сегодня, не знаю какое у тебя число, но предполагаю, что ** декабрь 2023 года) поленились начать изучать кодинг, и потеряли очень много возможностей что-то автоматизировать и вынести кучу денег.
Экономия средств
Ещё раз затронем ретромету. Сколько актуальных проектов есть на прокрут?
L0, zk, Stark? Да, но не совсем.
Так получилось, что этот список почему-то теперь выглядит вот так:
L0, zk, Stark, zkEVM, opBNB, Base, Linea, Mantle, Optimism, Arbitrum, Scroll, EigenLayer, Zora, Manta, Debank, Taiko, Aptos, gem.xyz, Odos, Aevo, Aleo, PartyDAO, Polyhedra, AltLayer, Metamask, Opensea Pro, Lens, Zetachain, Farcaster, Lamina1, Ether.fi, Orbiter, Socket, Swell, Venom, Brahma, PhiLand, RabbitHole, Friend Tech, Blur, Aztec, Blast, Berachain, Monad, Fuel
"Нужно ли вообще крутить все эти проекты?" - этот вопрос не относится к теме этой статьи, тут уже вы сами решаете.
В данном списке около 50 различных проектов. Что-то из этого блокчейн, что-то - свапалка, что-то - LSD протокол. Сложность работы со всеми разная. Но возьмём в среднем цену за каждый софт в 200-300$. Итого получаем, что вы отдадите ~$10,000-15,000 просто за софты, если захотите прокрутить все эти проекты.
И к тому же софт, скорее всего, будет закрытый и вы не сможете полностью контролировать безопасность и апдейты.
Настройка и запуск паблик софтов
Есть телеграм каналы кодеров, есть великий github. В них куча разного интересного материала в виде скриптов. И это прекрасно. Как минимум, с знаниями кода вы сможете их хотя бы запускать :0 Но ещё прекраснее - вы сможете модифицировать готовые наработки под себя.
Часто бывает такое, что вы нашли софт, который делает то, что вам нужно, но туда закралась ошибка, или вы хотите немного поменять логику или ещё что-то. В таком случае вы можете написать разработчику, но скорее всего не получите никакого фидбека. Поэтому лучшее решение данной проблемы - уметь кодить. Используя модифицированный паблик софт, вы:
- не тратите время на “изобретение велосипеда”.
- получаете уникальный софт “под себя”, и ваши кошельки не будут так сильно похожи на кошельки тех, кто использует данный паблик софт.
Такой навык может сильно помочь во время "горячих" активностей. Например, дроп Arbitrum. Представьте ситуацию. Вот вы сидите, и осталось 20 минут до клейма Арбитрума, у вас заряжен софт на автовывод, но что-то поменялось на сайте/в контракте, и вы буквально ничего не сможете сделать без технических знаний. А разраб, конечно же, будет гиперзанят в этот момент. И из-за этой мелочи вам придётся вручную клеймить на каждом кошельке, самому всё это переводить, и пока пройдёт время, вы уже сольёте свои токены по укатанной цене и потеряете 20-30% потенциального профита на курсе.
Модификация всего
Это продолжение предыдущего пункта. Вы можете модифицировать и свои, и публичные софты. Раскроем это подробнее.
У вас есть задача - написать ультимативный софт на zkSync. Какие модификации вы можете придумать?
- Полная рандомизация/кастомизация маршрутов по времени/количеству/сумме транзакций. Захотели все кошельки в одно время прокрутить - прокрутили, захотели все кошельки прокрутить в окно в 3 часа, а потом сделать дилэй в 7 дней, а потом снова - прокрутили. Короче, всё будет работать без вас, главное - всё правильно настроить.
- Добавление любых проектов и активностей. Захотели заминтить говножопанфт коллекцию - заминтили, захотели прокрутить зксинк свапалка, где твл равен 2 доллара - прокрутили.
- Ультимативный софт под себя. Прикрутить чекеры, веб-интерфейс, отправку уведомлений в телеграм, поддержку прокси, да, даже UI-автоматизацию ту же.
- Отказоустойчивость. Даже если всё крашнется, база данных, .json файл либо же обычный текстовик позволят сохранить всю информацию об аккаунтах и их маршрутах.
- Мультипроектность и минимизация бритвы (???). Зная свой софт, можно наперед проходить активности в нескольких проектах сразу, например, настроил софт на прогон Linea Voyage и Scroll Quintic NFT, взял 50 акков, разбил по 25 или ***, на одной пачке сначала делаешь Linea, потом Scroll, на второй пачке - наоборот. Коротко - можно так заморочиться, что ни одна бритва не спалит все твои многоллион кошельков.
Короче, вы буквально станете богом для ваших железных рабов! Взяли готовый софт на гитхабе, проаудировали, переписали, добавили своего и в продакшн!
Аудит
Этот пункт выходит из предыдущего.
В последнее время разработчики выкладывают всё больше и больше паблик софтов с открытым исходным кодом. Но начинают возникать вопросы: “есть ли дрейнер в коде?”, “не побреют ли меня за этот софт, так как разработчик наговнокодил?” и т.д. Минимальное понимание того, что такое код и как работает блокчейн позволят вам самостоятельно провести аудит этих софтов и смело запускать их. При этом вы экономите свое время (не крутите аккаунты руками) и не теряете деньги (в случае дрейна).
Ну и ещё, если вы покупаете софт, то в 80% он будет с закрытым кодом, и прогер может туда закинуть абсолютно всё, что угодно. Не странно ли постоянно бояться, что в коде что-то зашито, и ваши кошельки уведут во время клейма? Даже если продавец уверен в своей безопасности, его кодер мог подложить подлянку (вспоминаем кейс крипто**еты). Да, даже если код купленного софта - открытый, то вам всё равно нужно будет проверить его. На всякий случай.
Как минимум, вы можете сделать следующее:
- Проверить все адреса контрактов (чтобы не было транзакций на левые контракты).
- Проверить все исходящие запросы, отправляемые с помощью различных библиотек, которые позволяют делать http-запросы (с помощью http-запросов можно отправлять данные (приватники и т.д.) куда угодно, загружать дополнительный код с github или других источников).
- Все подключенные библиотеки прогоняем через пункт 1 и 2.
- Не запускать чужие скрипты на локальной машине
Этот вопрос описан в общих чертах и подробно рассматривать его в статье мы не будем.
Вывод
Одними руками достаточно сложно словить лайфчейнж. Вам нужно либо иметь большую команду воркеров, либо же мозг, который умеет кодить. Ваши шансы на профит увеличиваются кратно количеству ваших аккаунтов/итераций. Вы станете сильнее не в 2-3-10 раз, а в тысячу, десятки тысяч раз!
В этом вопросе всё линейно. Сделали 1 аккаунт Арбитрума - залутали 1,000 баксов, сделали 1000 аккаунтов Арбитрума - залутали 1,000,000 баксов.
Иногда мы понимаем только связку FOMO и чисел.
Что такое программирование?
Вы должны знать, что такое программирование. Если нет, то смело закрывайте статью. А если вы настойчивый, то идите на этот прекрасный сайт и возвращайтесь к статье после полученного ответа.
Чем занимаются web3 программисты?
Думаю, вы все знаете, чем занимаются web2 кодеры. В web3 также есть множество направлений для разработчиков:
- создание сайтов (frontend/backend)
- ...куча других направлений...
- и самое интересное для нас - автоматизация процессов
Думаю, вы уже поняли, но рассматривать написание смарт-контрактов, создание сайтов и т.д. мы рассматривать не будем - это нам и не нужно. Пока мы всё ещё крутимся в абузерской сфере, для этого достаточно простой автоматизации крипто (и не только) процессов. Сэтого проще всего начинать свое погружение в разработку под web3.
Как работает автоматизация криптопроцессов и причём тут HTTP-запросы
Каждый из нас пользовался адресной строкой браузера и вводил туда названия сайтов или какие-то ссылки.
- Когда вы нажимаете Enter, наш браузер отправляет так называемый HTTP-запрос по адресу, который указан в адресной строке.
- А сервер получает этот запрос и возвращает ответ, обычно html страничку, которую парсит наш браузер и показывает результат.
HTTP-запросы (HTTP Requests) — сообщения, которые отправляются клиентом на сервер, чтобы вызвать выполнение некоторых действий.
Взаимодействие кошелька с блокчейном работает точно так же:
- Мы просто отправляем специальный HTTP-запрос на ноду (сервер),
- А нода делает какое-то действие (например, показывает наш баланс или отправляет транзакцию).
То есть кошелёк или браузер выступают в качестве "веб морды", с помощью которой обычный человек может легко понять, куда жмакать, а потом посмотреть результаты его жмака.
Язык программирования позволяет сделать всё то же, что делает браузер, но без лишней мишуры. То есть с помощью того же Python мы можем сформировать один или несколько HTTP-запросов, отправить их на ноду, получить ответ и правильно его обработать. В результате мы получаем один и тот же результат, что и с "веб мордой", но при этом мы точно обгоним 90% пользователей.
Преимущество второго подхода заключается в том, что даже самые базовые навыки программирования позволят вам отправлять и обрабатывать не парочку запросов с одного аккаунта в секунду, а сотни и с множества аккаунтов. Плюс ваш скрипт может этим все заниматься самостоятельно, экономя ваше бесценное время. Но сейчас не об этом, все прелести программирования мы описывали вот здесь.
Думаю, с понятием HTTP-запроса все разобрались, а теперь перейдём непосредственно к автоматизации криптопроцессов.
Под автоматизацией криптопроцессов мы подразумеваем все те действия, которые вы можете делать с вашим кошельком. Уверен, что вы все видели, как выглядит смартконтракт и замечали, что все его функции поделены на read и write.
Read функции позволяют бесплатно получать информацию из контракта (например, totalSupply, decimals и т.п.), и никак не влияют на состояние блокчейна.
Write функции же требуют от вас вложений, так как подразумевают то, что данная функция изменит состояние блокчейна (например, функция approve, transfer и т.п.).
Так вот, упрощённо наша задача выглядит вот так - нужно автоматизировать read и write функции.
В любом случае, на более низком уровне всё это работает супер просто: c нашего кошелька (клиента) мы отправляем обычный HTTP-запрос на ноду (сервер), и эта нода что-то делает (даёт нам какие-то данные или изменяет состояние блокчейна).
Подробно все запросы к ноде и ответы вы можете найти в официальной документации: https://ethereum.org/en/developers/docs/apis/json-rpc/
То есть даже для того, чтобы написать самый простой web3 кошелек, вам просто нужно через код отправить HTTP-запросы по нужному адресу с нужными параметрами.
Примером HTTP-запроса может быть любой запрос, который вы вводите в адресную строку браузера. Но если говорить про взаимодействие с web3, то вы можете посмотреть примеры HTTP-запросов и их подробное описание тут.
Также можно этот запрос превратить в Python код с помощью этого сайта. Достаточно просто скопировать Request, вставить его на этом сайте и выбрать интересующий язык программирования (показали подробнее на скринах ниже). Запросы обычно представлены в виде curl команды (client for URL)
Curl - специальная утилита, которая позволяет из командной строки отправить любой запрос.
Сразу же спойлер: нам не придется читать официальную документацию, так как есть специальные инструменты (библиотеки), которые позволяют быстро и качественно взаимодействовать с блокчейном и делать всё, что вам нужно с помощью кода (но всё равно приятно осознавать, насколько всё просто работает, и в этом нет никакой магии).
Неверифицированные контракты и реверс инжиниринг аргументов транзакции
Чтобы перейти к основной части раздела придётся быстренько разобраться с тем, что такое функции и аргументы.
Функция представляет собой некий "чёрный ящик", в который ты что-то кладешь (аргументы функции), ящик что-то там шаманит (выполняется код функции) и по итогу ящик тебе что-то отдаёт (результат работы функции, это может быть новое число, статус задачи и т.п.). Результат будет зависеть от того, что мы в этот "чёрный ящик" положили.
В программировании принято писать функции таким образом, чтобы они выполняли какое-то одно действие. Давайте просто посмотрим небольшой пример, чтобы понять что такое функция на практике и в чём её полезность. Напишем функцию на python, которая будет здороваться с пользователем:
# создаём функцию say_hi def say_hi(): print('Hello') # вызываем функцию say_hi say_hi() # тут напечатается "Hello"
Максимально бесполезная функция готова, ура!!
Но даже такую бесполезную функцию можно сделать более полезной и прикладной, добавив в неё параметры. Для примера добавим параметр "name", в который будем передавать имя пользователя.
# создаём функцию say_hi с параметром name def say_hi(name): print('Hello,', name) # вызываем функцию say_hi с аргументом name say_hi(name='cryppi') # тут напечатается "Hello, cryppi" say_hi(name='ahillary') # тут напечатается "Hello, ahillary"
Теперь наша функция всё также выполняет одно действие (здоровается с пользователем), но теперь она печатает имя.
Что нам это даёт? Просто представьте, что функция вместо одной строчки кода содержит в себе 10 или 100 строчек кода. Теперь не нужно дублировать свой код и перепечатывать везде те самые 10 или 100 строчек кода. Достаточно просто написать название функции и поставить круглые скобки (вызвать функцию). А добавленные в функцию параметры позволят сделать функцию максимально настраиваемой (в программировании говорят абстрактной или обобщённой).
Почему где-то я пишу параметры, а где-то аргументы?
Параметры — это значения, которые принимает функция.
Аргументы — это значения, которые передаются в функцию при ее вызове в программе.
Вернёмся в web3 и к нашим транзакциям. Смарт контракт представляет собой просто набор read и write функций. Поэтому каждое наше обращение к смарт контракту это и есть вызов функции.
- В блокчейне множество контрактов, и на каждый мы можем отправить транзакцию (вызвать нужную функцию).
- У каждого контракта есть множество функций, которые мы можем вызвать.
- А у каждой функции есть специальные параметры, которые мы можем указать.
Мы разобрались с тем, что такое транзакция и как её отправить, но возникает вопрос: “а какие аргументы в неё вставить?”. Зачастую аргументы просты и понятны.
Например, возьмём придуманную функцию "swap", она будет иметь 3 параметра: "fromToken", "amount" и "toToken".
"fromToken" - токен, который будем свапать.
"toToken" - токен, на который будем свапать.
"amount" - количество fromToken
На псевдокоде функция может выглядеть так:
function swap(fromToken, toToken, amount) { // Тут тело функции: длинный и сложный код, который сделает свап. }
Таким образом, наша функция "swap" может быть вызвана следующим образом:
// Обмен 0.001 eth на usdc swap(eth_address, usdc_address, 0.001)
// Обмен 100 dai на usdc swap(dai_address, usdc_address, 100)
В реальной жизни всё немного сложнее. В транзакции ниже есть ещё параметры.
Простая транзакция (все параметры понятны и легко читаются):
"minToAmount" - минимальное количество второго токена, которое мы должны получить на кошелек (если контракт не сможет обеспечить указанное количество, транзакция не пройдёт). Этот параметр рассчитывается из slippage, который вы устанавливаете в веб интерфейсе.
"to" - на какой адрес зачислить "toToken". То есть эта функция позволяет сделать свап с одного кошелька и закинуть деньги на другой. Но в нашем случае мы просто указываем свой адрес.
Более подробно этот свап рассмотрим в конце статьи в разделе "Разбор WooFi свапа"
Сложная транзакция. Контракт неверифицирован и мы не можем посмотреть декодированные аргументы как в примере выше.
Чтобы разобрать "сложную транзакцию", в первую очередь я советую попробовать найти ABI (про него узнаем ниже) на github, в официальной документации или в другой сети. Но даже без ABI можно декодировать input data с помощью следующих тулзов: первый, второй.
Если не получилось, то не отчаивайтесь, мы попробуем "реверс инжиниринг аргументов транзакции".
Как думаете, откуда сайты-свапалки знают, какие параметры подставлять в транзакцию? Тут нет никакой магии. Просто какой-то программист уже изучил документацию контракта и составил все необходимые параметры.
Как сайт узнаёт об этих параметрах? Тоже всё просто: сайт делает http-запрос на свой сервер (абсолютно все взаимодействия в интернете происходят посредствам http-запросов в связке "клиент - сервер"), сервер возвращает ему все необходимые параметры, и далее мы просто отправляем транзакцию с этими параметрами. Но зачем нам эта информация? Дело в том, что мы, как программисты, можем перехватывать эти запросы и имитировать их через код (напомню, что мы уже умеем отправлять http-запросы, а также умеем превращать команду curl в код на любом языке программирования). На эту тему я записал большой урок и написал небольшую инструкцию, как быстро написать и имитировать на самых популярных языках программирования любой http-запрос.
Но если коротко, то для перехвата запросов, вам нужно нажать правой кнопкой мыши в любую часть сайта и выбрать "посмотреть код". Откроется консоль разработчика, в которой вам необходимо перейти на вкладку "networks" и проследить, чтобы был включен режим прослушивания запросов. Далее вы можете найти необходимый вам запрос по вкладке "Response", нажать на него правой кнопкой мыши и выбрать "copy -> copy as cURL". Далее необходимо вставить запрос на уже знакомый сайт, выбрать необходимый язык программирования и наслаждаться жизнью.
Для комфортной работы с автоматизацией блокчейн активностей очень важно понимать, как работают HTTP-запросы и браузер, чтобы можно было стащить запрос себе. Но если даже это не прокатило, то есть ещё способы отправить сложную транзакцию через код, но они выходят за рамки статьи.
Ты прочитал где-то 40% от всей статьи. Надеюсь, ты понял, зачем тебе нужен кодинг и как собсна происходит web3 автоматизация. Это ведь не так сложно, на самом деле. Если тебе всё нравится, то подпишись, пожалуйста, на наши каналы. Мы старались и писали эту статью в течение двух месяцев. Подпишись - cryppi и Ahillary. И ещё мы сделали совместный канал, где скоро выйдет кое-что, что поможет тебя в твоих кодерских начинаниях. На него тоже подпишись. Спасибо!
Какие ЯП подходят под web3
Многие понимают, что нет лучшего языка. ЯП - это прежде всего инструмент в руках программиста. А задачи бывают совершенно разные, какие-то ЯП справятся, какие-то — нет. Если у вас задача “забить гвоздь”, вряд ли вы будете долго думать между молотком и пилой. С ЯП та же история.
Сейчас мы рассмотрим основные ЯП под крипту и выделим их плюсы и минусы.
Python
...один из самых простых языков программирования и отлично справляется с задачей автоматизации криптопроцессов.
+ Очень простой язык программирования (большую часть времени будете думать “что написать?”, а не “как написать?”)
+ Огромное комьюнити web3 разработчиков, которые пишут именно на python (почти все вопросы, которые у вас могут возникнуть, уже были решены, поэтому легко найдете ответ в гугле или найдете человека, который подскажет вам ответ)
+ Множество официальных и неофициальных библиотек, которые позволят вам не “изобретать велосипед” и быстро решать поставленные задачи.
- Недостаток хороших библиотек в “свежих” проектах. Очень часто проекты в первую очередь публикуют документацию к API, и джаваскриптеры очень резво эту документацию реализуют. Поэтому библиотеки на JavaScript выходят раньше, а уже потом энтузиасты переписывают на Python. Даже если у проекта есть Python библиотека, она может быть плохо документирована или непонятно написана (привет, StarkNet и Aptos), но всё-таки работать с ними тоже можно. С другой стороны, если у нас есть документация API, нам не обязательно ждать выхода библиотеки. Мы можем самостоятельно всё реализовать через библиотеку requests (ниже мы покажем пример с Binance).
“А как же тот факт, что python - это медленный язык программирования?”
Часто слышу такой тейк в упрек Python. Как мы говорили раньше, чтобы взаимодействовать с блокчейном, необходимо просто отправлять запрос и получать ответ. Скорость отправки запроса на всех языках ~одинаковая. На скорость намного сильнее будет влиять наличие собственной ноды, расположение исполняющего кода и RPC. Как по мне, выбор между “быстрым C++”, на котором вы будете писать код месяц, и Python, на котором вы будете писать код 1 день, очевиден.
JavaScript
...очень крутой язык программирования (не путать с Java, это 2 абсолютно разных языка). JavaScript позволяет сделать практически всё: написать front end, back end, свою 2D/3D игру и многое другое. Также стоит отметить, что язык тоже на ура справляется с автоматизацией криптопроцессов.
+ Огромное комьюнити разработчиков по всему миру (как web3, так и web2).
+ Большинство криптопроектов выкладывают библиотеки для взаимодействия с их системой именно на JavaScript, так как большинство web сервисов пишутся именно на нём. Проект выкатывает библиотеку на JavaScript, чтобы другие проекты могли билдить что-то на их основе.
- Не самый простой язык. Имеет очень много подводных камней - новичку будет тяжело.
Solidity
...язык для разработки смарт-контрактов на платформе Ethereum. С помощью данного языка тоже можно отправлять транзакции, но контракты понимают, что на них запрос отправляется не с кошелька, а с другого контракта (это свойство раньше использовали хакеры для взлома смарт контрактов). Для наших целей (абузики) он не подойдет, но отлично подойдет для тех, кто хочет углубиться и взаимодействовать с блокчейном на более низком уровне (выносы через смарт-контракт аля NFT-сейлы/Stars Arena и т.д.).
Solidity также подойдёт тем, кто хочет билдить свои проекты в экосистеме Ethereum и т.д., но нужно понимать, что исходный код будет доступен всем людям (в том числе и хакерам). Поэтому подходить к разработке нужно осознанно и придётся уделять много внимания безопасности (либо просто форкнуть чужой контракт). Опыт разработки на низкоуровневых языках программирования позволит более грамотно обращаться с Solidity (поэтому данный язык не совсем подходит для новичков).
+ Позволяет инициировать сложные транзакции к смарт-контрактам.
- Достаточно ограниченный язык программирования, который создавался под единственную цель.
- Абсолютно не подходит для новичков. Solidity - сложный язык программирования с кучей недостатков. Если у вас нет опыта разработки на низкоуровневых языках (типа C++), то разобраться с языком и писать на нём будет крайне сложно (сложно именно стать разработчиком, так как нужен опыт из-за работы с безопасностью)
Golang, Rust, C++ и т.д.
Думаю, вы все что-то слышали об этих ЯП. Да, они есть. Да, ими можно кодить под крипту, но рассматривать мы их не будем, так как их относительно сложно и не совсем резонно изучать. Не для новичков.
UI-автоматизация (BAS, Zennoposter)
BAS и Zennoposter не являются языками программирования, но это инструменты, которые могут помочь нам в достижении целей. Смысл данных инструментов в том, что они позволяют автоматизировать всё через браузер, а не код. Грубо говоря, вы можете указать данным инструментам, куда тыкать в браузере, какую задержку использовать и т.д.
+ Хорошо себя показывают, если вам нужно обработать маленькое количество аккаунтов.
+ Позволяют сделать “UI касание”.
- Не подходят для работы с большой фермой аккаунтов (из-за того, что могут быть проблемы с интернетом, сайтом или программой, разработка с помощью этих инструментов переходит из разряда “разработки” в разряд “отлавливание багов”)
- Не подходят для работы с большим количество интернет ресурсов (из-за сильной зависимости от UI данные инструменты могут перестать выполнять то, что нужно, если разработчик сайта решит немного поменять front end).
Насчет UI-автоматизации ещё раз. Во время сбора фидбека для этой статьи мы услышали пару тейков о том, что мы очень и очень вскользь упомянули BAS и Zennoposter. Да, мы согласны с этим и согласны с тем, что через эти инструменты гораздо проще и удобнее войти в автоматизацию, но ведь наша статья именно про кодинг. Мы считаем, что UI-автоматизация хороша на краткосрок (можно больше узнать про логику проектирования скриптов и т.д.), но делать масштабные проекты таким образом вы не сможета. Со знанием кода - да. Учите код.
UI-автоматизиция (Selenium, Playwright, UIAutomator2)
Это тоже не языки программирования. Это фреймворки (код, который расширяет возможности языка) для тестирования и автоматизации взаимодействия с пользовательским интерфейсом (UI) веб-приложений или мобильных приложений. Зная язык программирования (например, Python, JavaScript или Java), вы cможете очень быстро разобраться с любым из вышеперечисленных фреймворков и использовать их для автоматизации UI.
Эти фреймворки дают вам возможность делать всё то же самое, что делает пользователь мышкой и клавиатурой на компьютере или пальцами на телефоне, а именно клики, заполнение форм (регистрация/логин на сайте), отправка запросов, решение капчи, использование расширений (например, metamask) и т.д.
+ Позволяют автоматизировать сложные запросы, которые составляются на стороне клиента.
+ Позволяют сделать “UI касание”.
- Хрупкость скриптов: скрипты могут стать хрупкими и легко подвергаться нарушениям из-за изменений в пользовательском интерфейсе или структуре приложения. Даже небольшие изменения могут потребовать обновления скрипта. Отсюда следует сложность поддержки, необходимость постоянного обновления, зависимость от внешних факторов и временные затраты.
- Сложности в работе: в некоторых случаях фреймворки могут столкнуться с ограничениями при работе с некоторыми технологиями, сложными анимациями или динамическим контентом.
Почему Python лучший язык для начала в web3?
Мы разобрали основные ЯП для наших целей, надеюсь, вы уловили разницу между ними. Но...
Мы считаем наилучшим для начала кодинга в крипте Python.Почему?
Что такое Python?
Python - интерпретируемый язык программирования высокого уровня с динамической типизацией 😰
- Интерпретируемый означает то, что язык выполняется “построчно”. Каждая строка кода в языке - инструкция для компьютера.
- Интерпретатор - специальная программа, которая читает код построчно и “переводит” ваш код на язык компьютера прямо на ходу. Если вы совершили ошибку где-то в конце кода, то верхняя часть всё равно отработает. Главное отличие между интерпретируемыми и компилируемыми языками программирования заключается в том, что компилируемые языки программирования на этапе компиляции создают исполняемый файл и в дальнейшем запускают именно его (если код программы изменится, исполняемый файл нужно будет перекомпилировать, а если в коде есть ошибка, то программа даже не сможет скомпилироваться). Из-за того, что интерпретатору требуется каждый раз переводить код в машинный, язык работает медленнее компилируемых языков.
- Язык высокого уровня - очень вкратце, чем выше ЯП, тем он больше похож на человеческий. Для пример загуглите "разница Ассемблер и Python" или посмотрите вот здесь.
- Динамическая типизация - по сути, программирование - это жонглирование данными. Мы можем читать, записывать и перезаписывать данные. Они бывают разных типов: может быть целое число, дробное число, строка, массив и т.д. Под любые данные компьютеру нужно выделять место в оперативной памяти. И если в строго типизированных языках мы явно указываем компьютеру сколько выделить памяти, то в языках с динамической типизацией компьютеру приходится самому рассчитывать сколько памяти выделить, отсюда проигрыш по времени, но более низкий порог входа в язык.
Почему отдаем приоритет Python?
Python - один из самых простых языков, который позволяет писать очень сложные вещи (тот же YouTube частично написан на Python). Язык прощает множество ошибок новичков и позволяет быстрее приступить к практической разработке. У языка огромное и сильное комьюнити, а значит, “велосипед” всегда будет изобретён.
На Python есть библиотеки, написанные практически под все блокчейны, и данный факт позволит нам беспрепятственно думать о задаче, а не о способе реализации.
Некоторые из вас могут спросить: “Почему не JavaScript?”. Если копать вглубь, то, по моему субъективному мнению, JavaScript по сложности близок к C++ и содержит огромное количество подводных камней, которые могут оттолкнуть новичков. Мой первый язык был C++, и после него я учил и Python, и JavaScript. На Python у меня ушло около 1-2 недель, а JavaScript’у я посвятил около 4 месяцев, чтобы со всем разобраться.
Как учить программирование?
Вот и мы перешли к основной части. Как научиться всё-таки этому вашему погромированию? А вот мы сейчас попробуем это выяснить.
Общие советы
В этой части - общие советы, которые могут помочь в начале обучения.
Формат
Выбрали Python. Начать его изучение я предлагаю с выбора формата, в котором вам комфортнее воспринимать информацию:
Лично я сторонник видео на ютубе, но в итоге всегда приходишь к строгой документации, так как там самая актуальная информация. Очень важно, чтобы вы качественно воспринимали информацию, так как на этом уровне будет закладываться база.
Ищите учителя, который считает вас идиотом
С форматом определились и теперь надо оценить автора контента. Проблема в том, что очень сложно найти человека, который правда шарит в программировании и при этом умеет объяснять на доступном языке.
Что значит “умеет объяснять на доступном языке”? Это значит, что человек может спуститься на уровень новичка и объяснить доступным языком. Не сочтите за грубость, но идеально, когда вас считают идиотом.
Во-первых, каждая мелочь будет разжевана для вас.
Во-вторых, вам будет не страшно задать любой вопрос.
Бабло для обучения (секрет для бояр)
Практически любую специальность можно освоить через интернет. Проблема в том, что вы будете часто запинаться о подводные камни, “копаться в говне”, которое никогда не примените на практике и тратить на это всё время и мотивацию. В web3 каждый подводный камень может встать в копеечку:
- Неправильно отправленная транзакция = сбрили все аккаунты.
- Получили не те данные = потеряли депозит кошелька.
- Ну или просто наговнокодили = потеряли время и нервы
Не поверите, но эта проблема решается ментором. Но возникает другая проблема: "Как понять, что ментор правда хорош в своем деле, и он научит вас именно тому, что вам нужно?" В данном случае большую роль играет удача, но чтобы свести риски к минимуму советую обратить на следующие аспекты.
- У ментора есть открытый контент. В открытом контенте вы сможете найти отзывы и проанализировать, понятно ли объясняет для вас человек.
- У ментора есть практический опыт. Очень часто менторами набирают людей без опыта, так как им можно меньше платить.
- Программа ментора соответствует тому, чему вы бы хотели обучиться. Советую скинуть программу кому-нибудь, кто точно шарит, чтобы этот человек сказал своё мнение.
Лично у меня есть опыт программирования на высокоуровневых языках (Python, JavaScript, PHP) и на более низкоуровневых языках (C/C++, C#). Но при этом у меня всё равно есть менторы в web3 и web2 разработке. Когда вы платите ментору, вы покупаете его опыт и экономите своё бесценное время. Для меня смарт купить многолетний опыт человека, упакованный в несколько месяцев самой полезной и отфильтрованной информации. Но если вы пока не боярин, и у вас достаточно времени, чтобы самостоятельно прорываться через тернии к звёздам, то специально для вас в конце статьи будет roadmap по web3 автоматизации на Python.
Практика
В этой части - общие советы именно по практике. На этом уровне у вас есть всё необходимое, чтобы писать свои проекты. Вы знаете язык, выбрали и разобрали нужные вам библиотеки и готовы к бою. Во время практики у вас может сложиться впечатление, что вы на самом деле ничего не знаете и вся теория прошла мимо вас. Но это не так. Дело в том, что теория и практика - две разные сущности одного целого. И чтобы стать разработчиком, мало просто выучить теорию. Необходимо её постоянно подкреплять практикой, так как именно она требует от вас комбинирования всех теоретических знаний и умения загуглить то, что вам необходимо в данный момент (а иногда под уникальную задачу нужно самому придумать решение). Некоторые разработчики изначально выбирают скипнуть теорию и учиться на практике. Такой способ тоже имеет право на жизнь, но выбирая его, вы можете упустить некоторые полезные фичи языка и в некоторых местах писать “костыли” или не самый оптимальный код.
Важно грамотно комбинировать теорию и практику и не пропускать задачи, которые кажутся простыми на первый взгляд. Но тут тоже важно уметь отличить простую задачу от сложной, чтобы не перегореть и не потратить кучу времени впустую. В данном случае на помощь может прийти либо старший товарищ, либо ментор (и того и другого можно найти в чатах по программированию).
Во время изучения языка программирования могу посоветовать прорешать практику с канала @ahillary. На каждую тему вы сможете найти задачи 3-х уровней (от самых простых до сложных).
Найти практику под фреймворк ничего не стоит. Вспомните, почему вы выбрали данный фреймворк. Воплотите то, что хотели давно написать, и не важно, с какими трудностями вы столкнетесь.
Иногда можно объединить приятное с полезным и предложить свои услуги на рынке (даже бесплатно), но за 1-2 заказа или 1-2 месяца работы вы очень сильно прокачаете все свои скилы, а возможно, и заработаете, и обретете новые полезные знакомства.
Советы по практике
- Переходите к практике после теории. Выше я уже писал про баланс теории и практики, но тут хочу сказать, что у меня ни один раз было такое, что после написания кода я возвращался к документации и каждый раз проскальзывала мысль: "а что, так можно было?!".
- Писать код на листочке. Я считаю, что это самый лучший способ проработки практики по основам любого языка. Когда вы пишете код на листочке, у вас нет права на ошибку (иначе придётся переписывать). Но самое лучшее то, что вы начинаете задумываться о каждой строчке кода, начинаете думать о том какая строчка будет выполнена следующей и как именно она выполнится (вы превращаетесь в интерпретатор кода). Такая практика позволит вам обнаружить все слабые места по теории. Знаю, что многие новички, если у них что-то не получается, бездумно меняют код в надежде, что "оно" запустится. С листочком такое не пройдёт. Также некоторые компании во время собеседования на этапе life coding просят кандидата написать код "на листочке".
- Кроме листочка можно использовать визуализаторы кода, которые покажут вам, что происходит на каждой строчке кода (чему равна каждая переменная, какой шаг интерпретатор/компилятор выполнит следующим и т.п.). Визуализатор, который меня выручал десятки раз: https://pythontutor.com/
- Читать чужой код. Этот совет относится к более продвинутым кодерам, так как читать чужой код зачастую сложно, но крайне полезно. В чужом коде вы можете встретить различные фишки языка, которые упустили во время изучения теории и документации. Самое главное, на что стоит обратить внимание в чужом коде - архитектура. Со временем ваши проекты будут разрастаться и поддерживать их будет всё сложнее и сложнее. Есть способы писать масштабируемый и отказоустойчивый код, который вас не подведёт. Все эти техники относятся к архитектуре. Но что делать, если вы уже изучили язык и хотите писать большие проекты, а толстые книги по паттернам проектирования читать не хочется? Ответ простой - подсмотрите архитектуру и способы оформления кода в чужих проектах. Тут есть один нюанс: вы легко можете наткнуться на говнокод. Благо есть места, где вероятность говнокода минимальная, например архитектуру кода вы можете подсмотреть в официальных библиотеках проектов. А красивые решения алгоритмов подсмотреть в топе решений на https://leetcode.com/.
IDE
Теперь осталось найти место, где мы будем писать код. Код - это просто текст, а интерпретатор или компилятор его исполняют. Поэтому код можно писать даже в блокноте, но это неудобно. Чтобы программистам было комфортно, были созданы IDE (интегрированная среда разработки).
От блокнота IDE отличает то, что:
- В IDE есть подсветка синтаксиса (позволяет проще заниматься чтением и редактированием кода).
- Автодополнение (позволяет не писать полностью длинные команды, по сути работает, как всем известный Т9).
- Встроенный линтер (присутствует не во всех IDE, но новичкам советую использовать IDE со встроенным линтером или установить его в любимую IDE). В любом языке есть правила грамматики, пунктуации и т.д. Если вы не соблюдаете эти правила, то другие люди вас поймут, но точно усомнятся в ваших умственных способностях. В языках программирования та же история. Есть определенные правила написания языка. Интерпретатору/компилятору без разницы, как вы пишете код, а вот люди, которые его читают, опять же усомнятся в ваших умственных способностях. Поэтому призываю всех сразу писать код грамотно и по стандартам. Понимаю, что изучение стандартов, чтение книг по
грамматикеоформлению кода, - дело очень скучное. Поэтому специально для нас был изобретен линтер, который подчеркнет и подробно расскажет за все ваши косяки.
Конкретно в Python есть 2 самые популярные IDE:
- PyCharm - достаточно тяжелая программа для профессиональных разработчиков, но при этом позволяет максимально комфортно работать с Python кодом без танцев с бубном. Есть встроенный линтер. Очень рекомендую новичкам.
- VS Code - легковесная программа, которая “из коробки” мало что умеет. Но на VS Code есть огромное множество бесплатных “батареек” (плагинов), которые способны превратить VS Code в средство для разработки не только на python, но и на любом другом популярном языке программирования. Новички могут с ним работать, но с трудностями столкнутся еще на этапе запуска кода. Но так как инструмент сверхпопулярный, то трудности точно окупятся в будущем.
Для других языков программирования я советую посмотреть видео на ютубе по запросу “топ IDE для {…}”
Фреймворки (библиотеки)
Вектор обучения подобран, IDE выбран, язык программирования выучен. Что делать дальше? Чистый язык программирования - как машина без двигателя. Можно послушать музыку, укрыться от дождя, попонтоваться перед друзьями, но весь потенциал не раскрыт. В случае с языками программирования мотором будет выступать так называемый “фреймворк” (библиотека). Он позволяет по-настоящему раскрыть все возможности языка и использовать язык под свои конкретно-прикладные задачи. Для машины можно подобрать разные моторы (для дрифта нужен один мотор, для драга - другой, а езды по городу = третий). В язык программирования тоже можно вставлять разные фреймворки для различных задач. Зачастую времени на изучение фреймворка может потребоваться даже больше, чем на изучение самого языка. Но время точно окупается, и в итоге вы быстро разрабатываете то, что нужно именно вам.
Если говорить на более профессиональном языке, то фреймворки нужно отличать от библиотек:
- Библиотеки представляет собой набор функций или классов, предназначенных для решения конкретных задач (например, библиотека для работы с сетью "requests", которая предоставляет функции отправки любых http запросов, создание пользовательской сессии итп).
- Фреймворк представляет собой основу (инфраструктуру) для разработки программного обеспечения, которая упрощает создание приложений. Очень часто сам фреймворк управляет ходом выполнения программы (например, фреймворк Django для разработки сайтов предоставляет файловую структуру проекта и может сам выступать в качестве web сервера, который будет обрабатывать запросы).
Для упрощения, мы не будет разделять понятия "фреймворк" и "библиотека".
У каждого языка программирования есть стандартные библиотеки, которые доступны "из коробки". Также всегда есть возможность установить дополнительную библиотеку/фреймворк с помощью простой команды. Такой механизм оправдывается тем, что новые библиотеки выходят ежедневно и каждый желающий может создать свою библиотеку и выложить в открытый доступ. То есть вы можете расширять язык программирования именно тем, что нужно вам под задачу, избегая лишних зависимостей.
Фреймворки и библиотеки расширяют возможности языка (без них никто бы не пользовался языком). Как раз благодаря активному комьюнити, которое создаёт библиотеки, многие языки стали популярны.
Главное правило программирования - "не создавай велосипед!". Если вы пилите какую-то программу, обязательно погуглите. Возможно, нужный функционал уже кто-то реализовал в библиотеках (99% что найдёте то, что нужно). Поэтому старайтесь использовать библиотеки и фреймворки.
Если мы говорим про web3, то для взаимодействия с EVM сетями на python существует библиотека web3.py. На JavaScript есть 2 популярные библиотеки web3.js и ethers.js.
Если мы говорим не о EVM-сетях (например StarkNet, Aptos, …), то очень часто проекты публикуют свои библиотеки. Эти библиотеки часто называют SDK (software development kit - набор средств разработки). В SDK находятся все необходимые функции для взаимодействия с блокчейном.
Сразу скажу, что изучение библиотек для работы с web3 и изучение различных SDK не требует большого количества времени (за 1-2 дня можно освоить просто по примерам).
Практика с ретродропами
Есть мнение, что абуз скоро умрет и выгоднее будет делать не на количество, а на качество. Насколько актуально учить прогу, если к моменту, пока разберешься, это может стать неактуальным?
Абсолютно всё в блокчейнах, основанных на EVM, держится на смарт-контрактах. А чтобы с ними взаимодействовать, нужно просто уметь читать данные из смарт-контрактов и отправлять транзакции (их предварительно составив). То есть если вы научились взаимодействовать с web3, то вам не составит труда переключиться с ретродропов на NFT или любую другую web3 мету.
Практика в программировании имеет некоторые сходства с практикой в качалке. Чтобы прогрессировать, вам нужно стараться повышать вес (усложнять задачи) и выполнять разные упражнения (разные задачи). Например, сначала вы учитесь отправлять супер простые транзакции (пример будет ниже), чтобы понять, как вообще их отправлять, а потом переходите к более сложным. Или, например, сначала пишете код, который обрабатывает 1 аккаунт на одной свапалке, а потом дописываете код, чтобы он обрабатывал 5, 10, 100, 1000 аккаунтов на 1, 2, 5, 10, 50 свапалках. Помните об этом, когда перейдёте к практике в роадмапе.
Снизу на фото вы можете увидеть пример легкой и сложной транзакции. Вам нужно уметь посылать транзакции любого уровня сложности.
На чем держатся популярные проекты (L0, zk, Stark)?
Большинство проектов используют: либо Solidity для написания контрактов, либо какой-то свой язык, либо что-то непопулярное (как, например, Starknet с языком Cairo). Новичку будет очень сложно и нецелесообразно учить подобные языки, так как они предназначены для очень узконаправленных задач. Также основная проблема таких языков для новичка - маленькое комьюнити. Некому будет задать вопрос и крайне сложно будет прогуглить проблему.
За какое время пишется средней руки софт для ретро? И какие знания и навыки нужны для его написания?
Всё зависит от вашего опыта и сложности той или иной активности. Если у вас есть хотя бы небольшой опыт, то вы сможете легко автоматизировать одну активность за 2-3 часа. Но бывают исключения. Например, в zkSync вы столкнётесь с неверифицированными контрактами и придётся разбираться, как с ними работать (еще +5-8 часов плотного ворка на разбор). Если вы пишете не под стандартный EVM-блокчейн (например, Starknet или Aptos), то вам придется разобраться еще и с самим блокчейном (+5-12 часов плотного ворка на разбор).
После того, как активности написаны, вам нужно правильно ими “дирижировать”. Заставить их работать рандомно и без ошибок. Это еще несколько часов работы. Если у вас средний опыт, то вам потребуется примерно 1.5 часа на одну активность и еще 1 час на то, чтобы грамотно оформить и протестить софт.
Насколько легко быть криптокодером
Автоматизация процессов в web3 не требует от вас практически ничего кроме времени, потраченного на практику. В web2 существуют фреймворки, которые сложнее самого языка. Например, чтобы устроиться на работу Back End разработчика на Python кроме самого языка вам придется выучить: Django, FastAPI, SQL, AWS, RabbitMQ, Celery, Redis, MongoDB и много чего еще. На изучение всего этого многие на это тратят больше года, и тогда у них появляется шанс устроиться на вакансии уровня Junior+ (для следующих уровней будет необходим коммерческий опыт).
А чтобы научиться писать хороший код и автоматизировать процессы в web3, вам потребуется 1-2 месяца максимум (с учетом того, что вы неплохо знаете python). Таким образом, через 1-2 месяца вы сможете автоматизировать практически всё, что вам нужно и использовать это в повседневной жизни. Отличная перспектива для новичка, который хочет попробовать себя в кодинге.
Как учить?
Если вы не хотите тратить кучу времени и денег на самостоятельное обучение, то есть решение для вас. Мы запустили совместный курс по web3 автоматизации. Следующий поток будет - 2024, март-апрель. Следить за анонсами можно в данном канале. Подпишитесь!
Roadmap web3 разработчика на Python
Наконец дошли до роадмапа. Роадмап = это роадмап, мы не будем объяснять вам, как через код подключиться к блокчейну и как отправлять транзакции. Мы сделаем ещё круче. Мы дадим вам ссылки на статьи/видосы, которые научат вас через код подключаться к блокчейну и отправлять транзакции. За нас это всё сделали другие бравые ребята. Прелесть роадмапа в том, что мы укажем вам верный порядок, как всё это нужно изучать и какую практику вам стоит проделать.
- Roadmap может показаться неполноценным и малоинформативным, но наш опыт показывает обратное: мы специально не завалили вас тысячью различных непонятных ссылок. Это юзлесс. Их никто не читает. Мы даём вам скелет, и уже по запросу вы сами ищите нужные материалы.
- Каждый пункт субъективен и может быть бесконечно дополнен.
- Прохождение Roadmaр'а рассчитано примерно на 2-3 месяца
- И помните, что в роадмапе самое главное - это ваша личная цель. У кого-то цель - вынести проект. У кого-то цель - написать антидрейнер. У кого-то цель - написать ультимативный софт под Linea Квесты. Не забывайте про неё.
Купите chatGPT
Просто купите. Он стоит ~25$ в месяц. Подробнее об этом инструменте мы рассказали вот здесь.
Изучение языка программирования.
Изучение языка программирования. Я уже писал, чтобы качественно учиться, нужно подобрать нужный вам формат. А курсов по начальному уровню любого языка программирования просто бесконечное множество.
- Python:
- Если Python - это ваш первый язык программирования, то советую вот этот бесплатный курс с практикой и поддержкой в чате (за 1-2 месяца можно очень сильно прокачаться)
- Если вам ближе текстовый формат, то будет смарт прочитать хотя бы 1 раз книгу Марка Лутца "Изучаем Python".
- Если вы уже имеете опыт с другими объектно-ориентированными языками программирования, то вам достаточно будет прочитать книгу “A byte of Python”. На книгу вы потратите 1-2 недели и уже будете знать достаточно о Python, чтобы приступить к практике.
- Java Script:
- Видеоформат: JS за 10 часов
- Текстовый формат: Сайт, на котором можно найти ответ почти на любой вопрос (по этому сайту я изучал JS)
Методички Алекса Крюгера
Эти методички дадут начальное понимание того, что такое web3, смарт контракты и как это всё можно автоматизировать. MUST HAVE.
Изучение web3 фреймворка
- Python:
- Если вам больше понятен текстовый формат, то вам подойдёт статья на Хабре (1 часть, 2 часть). Статья немного устарела, поэтому советую параллельно со статьёй обратиться к документации.
- Если вам больше понятен видеоформат, то вот самое подробное видео про работу с web3 на python c актуальными примерами и неплохой структурой кода.
- Java Script:
Практика.
Тут всё очень просто. Вспоминаем, что у вас должны быть какая-то цель. Выбираете проект, который хотите автоматизировать и воплощаете это в жизнь.
Ещё один классный способ найти практику - просто предложить кому-то в чате свои услуги. Если у вас маленький опыт, но много амбиций, вы точно справитесь и очень серьёзно прокачаетесь. Главное - не ссать. А если у вас совсем нулевой опыт и нет идей что автоматизировать, то могу предложить такой роадмап с практикой:
- LayerZero Stargate - здесь вы научитесь отправлять классические транзакции и читать документацию.
- ZkSync Era - контракты на этом БЧ неверифицированные, и с ними есть определённые проблемы
- ZkSync Lite - на этом БЧ все транзакции работают на подписях
- StarkNet - советую разобраться, чтобы понимать, как работать с не-EVM блокчейном.
- Aptos - тоже не EVM блокчейн с уникальной и не похожей ни на что архитектурой.
И если вы разберётесь со всеми этими проектами, то автоматизация других станет довольно понятной задачей. Но ещё лучше, если вы составите роадмап из своих проектов, вон сколько проектов вылезло:
L0, zk, Stark, zkEVM, opBNB, Base, Linea, Mantle, Optimism, Arbitrum, Scroll, EigenLayer, Zora, Manta, Debank, Taiko, Aptos, gem.xyz, Odos, Aevo, Aleo, PartyDAO, Polyhedra, AltLayer, Metamask, Opensea Pro, Lens, Zetachain, Farcaster, Lamina1, Ether.fi, Orbiter, Socket, Swell, Venom, Brahma, PhiLand, RabbitHole, Friend Tech, Blur, Aztec, Blast, Berachain, Monad, Fuel
Также не стоит забывать писать автоматизации под хайповые меты (не под ретро, а например, под тот же Memeland или Friend.tech). Ничто не мотивирует так сильно как первый профит. После заработка первых 10-20 баксов появляется азарт: хочется больше, быстрее, хитрее. Забываешь про время и сложности и фигачишь на потоке.
Во время написания этого парта (3 декабря) рынок довольно хорошо оживился и каждый день есть очень много профитных активностей. Пробуйте.
Для доп. мотивации. Вот опыт одного из наших единомышленников, как он автоматизировал актуальные меты и зарабатывал неплохие деньги (от 10к$):
Кейс №1 - Binance NFT
На волне хайпа по NFT в 2021 году Binance запускает свой Маркетплейс и начинает, чуть ли не 1-2 раза в неделю, выдавать дропы. Первое время ажиотаж на эти дропы был дикий, и конечно же под них начали писать ботов.
Я не стал исключением. Скрипт до безобразия простой: за 1 минуту до начала дропа начиналась регулярная отправка запросов на покупку (с минимальными паузами, чтобы не попадать под лимиты). Добавьте сюда несколько серверов/скриптов/аккаунтов.
Почему скрипт запускался заранее? Потому что, дроп, зачастую, не стартовал ровно секунда в секунду, как было указано (условно вместо 14:00:00 он запускался в 13:59:58). Плюс, нюанс отправляемых запросов был в том, чтобы отправить их заранее, чтобы они дошли на сервер (помним про сетевые задержки) ровно к моменту старта дропа. По итогу, когда у обычных пользователей на сайте заканчивался таймер и активировалась кнопка "Купить", покупать там уже нечего. Боты все вынесли. Команда Binance активно сопротивлялась ботам: ввели более жесткие лимиты на количество запросов с одного IP, ввели капчу. Но все эти шаги также успешно обходились.
На скрине один из самых вкусных и быстрых уловов - кейс из StepN.
Помимо ловли дропов, был написан скрипт для флипа на Маркетплейсе Binance NFT. Бот собирал статистику продаж различных NFT и параллельно мониторил новые предложения. Так как рынок был достаточно новый, не многие пользователи понимали реальную стоимость этих NFT (под реальной стоимостью я понимаю цену, за которую эти NFT все-таки продавались и достаточно часто), особенно если у NFT были какие-то деления на редкости и другие нюансы.
Точный доход не скажу, так как история длилась с пол года и с разной скоростью/объемами
В один день, неожиданно порадовали MOBOX. Одно время, можно было получить бесплатный аватар от MOBOX в приложении Binance. Утилити этих NFT было ровно никаким. Просто рандомный человечек. Единственное, ее можно было поставить на аватарку своего профиля. По прошествию нескольких месяцев, когда все уже давно забыли про них, MOBOX объявили о запуске своей игры, для доступа к которой и нужны были эти NFT. Заодно появилась возможность их продать на Маркетплейсе Binance. Цена по-моему стартовала баксов с 10. И пользователи их лили в огромным количестве. При этом, по непонятной мне причине, эти аватарки с такой же скоростью откупались и обратно. Цена на них падала очень медленно, в течение нескольких дней, до примерно 2-2.5 баксов. Мой бот в постоянном режиме мониторил минимальную цену, по которым выкупались эти аватарки и старался выкупить новые предложения, существенно заниженные по стоимости. То есть, условно, если продавались они за 10 баксов, то закупались за 8 и ниже, и тут же автоматом выставлялись обратно. С учетом 2% комиссии и медленно падающей цены, каждая NFT приносила профит. Доход за эти несколько дней был где-то $10-20к
Стоит заметить, что во всех этих примерах, было достаточно большое количество конкурентов, где начинается уже борьба с ними. Нервы бьют просто жесть, когда ты видишь что твой бот закупает закупает закупает, и тут раз и пошли ошибки, потому что кто-то уже выкупил нужную тебе NFT. Поток, драйв, пот, мысли носятся, сердце херачит. Ты уже считаешь этот доход своим и отдавать его кому-то ох как тяжело. Поэтому придумываешь новые и новые способы быть быстрее.
Кейс 2 - Solana и спамеры
В 2022 году активно играл в одну игру на Solana. В процессе, достаточно хорошо разобрался в различных нюансах этой сети.
Если кто-то активно использовал кошелек Solana, то наверняка замечал появление в нем неизвестных NFT. Обычно они говорили о том, что вы что-то выиграли или получили скидку или другого рода халява. Очевидно - это все мошеннический спам. В свойствах таких NFT были ссылки на сайт мошенника, на котором вам предлагалось подписать транзакцию (то есть забрать выигрыш) и вместо выигрыша вы передавали все, что есть на кошельке, мошеннику.
Здесь нужно понимать, как работают токены и NFT на Solana. Условно, когда другой пользователь присылает вам NFT, то она приходит не на ваш конкретный кошелек, а создается отдельный адрес хранения, который привязан к вашему кошельку. И как раз таки, отправитель оплачивает создание этого адреса хранения. Стоит это не великую сумму, всего лишь 0.00203928 SOL (по текущему курсу ~0.11-0.12$). Вы же, в свою очередь, можете избавиться от этой NFT, вызвав функцию сжигания доступную в кошельке Phantom, тем самым, вернув эту сумму к себе на кошелек (за минусом небольшой комиссии за саму транзакцию). На момент, когда я занимался этим ботом, SOL стоил в районе 20-25 баксов и чистый профит с жигания NFT выходил центов 5.
Задачей моего бота стало получение на кошелек хотя бы одной спамной NFT (иногда получалось и не одной). Изначально, спамеры не знали, что против них работает бот и отправляли свой спам за достаточно простые действия (перевод на другой кошелек небольшой суммы в SOL, или переброска популярных тогда токенов из игры StepN, причем в любых количествах и тд). То есть создаешь Кошелек 1, закидываешь на него с биржи немного токена из StepN и чуть SOL на комиссии. Затем перекидываешь это все на Кошелек 2, затем на Кошелек 3 и тд. При этом на Кошельке 1 уже появляется спамная NFT. Затем одной транзакцией cжигаешь весь спам и забираешь со всех кошельков остатки на основной (Немного упростил схему, там немного замудрено было с оптимизацией, чтобы было меньше транзакций и комиссий, но принцип примерно такой).
Дальше спамеры начали фильтровать такого рода мусорные транзакции и отслеживали только пересылку NFT. То есть нужно было купить одну дешевеньку (но торгуемую на площадках) NFT и перегонять ее.
Следующим шагом спамеров по борьбе с моим ботом стало отработка транзакций покупки/продажи на маркетплейсах. Например на Magic Eden. Так как у Magic Eden проходила какая-то акция и на некоторые коллекции не было комиссий, то схема была такая Кошелек 1 выставлял предложение на продажу, а Кошелек 2 покупал ее.
Уже скоро и эта схема перестала работать и я забросил за ними гоняться. Все таки профит тут был не великий, и тратить на них время стало жалко.
В рамках одной недели пока занимался таким ботом было прогнано около 15-20к кошельков и заработано чуть больше $1000
Кейс 3 - один из недавних - Friend.tech
Да да, под конец лета, мы все увидели, как, даже на медвежьем рынке, можно делать деньги. Friend.tech заработал несколько десятков миллионов $ буквально за пару месяцев. Я к нему подобрался, не сказать чтобы в числе самых первых. Думаю уже под конец августа/начало сентября. После проведенного анализа выяснил, что хорошо перепродаются акции пользователей у которых подписчиков в Twiiter 10к+. При этом, дабы не лезть в дебри анализа почему тот или иной блогер стрельнул, а остальная сотня таких же нет, я поставил себе цель покупать самые первые, то есть самые дешевые акции всех пользователей от 100 подписчиков.
Написал бота, который мониторил транзакции покупки 0 акций, затем получал по API Twiiter информацию об аккаунте и если подписчиков было много - старался купить. И какой был результат? Очевидно - болт. Конкуренции было просто тьма.
Стал анализировать транзакции чужих ботов. Сначала нашел такую схему: бот мониторит транзакции пополнения нового кошелька через официальный мост и затем начинает долбить каждую секунду запросами на покупку, чтобы попасть в один блок с транзакцией на покупку 0 акции. То есть, так как транзакции обрабатываются последовательно в каждом блоке, то задача становится, попасть прям следом за покупкой 0 акции.
Схема интересная, но мега-затратная. Времени между пополнением кошелька и покупку 0 акции могло пройти несколько минут. В результате чего тратились десятки долларов на комиссии. Здесь надо заметить, что когда ты вызываешь контракт, ты по-любому платишь комиссию, даже если по какой-либо причине траназакция не прошла (например ты отправил запрос на покупку 1 акции, а владелец еще не купил свою 0 акцию).
Я нашел способ снизить расходы на ошибочные транзакции - а именно, написать свой смарт-контракт. В нем сначало идет проверка, была ли куплена 0 акция и затем только уже вызывалась функция покупки. Так как функция проверки была максимально простой - то ее вызов, даже с ошибочным результатом, тратил заметно меньше газа. (хоть и все равно прилично при массовых запросах). К моему разочарованию, я нашел еще таких же умников, кто пользовался своими контрактами. В этот момент я решил забить на этот проект, так как затраты на комиссии и борьбу с конкурентами - были слишком высокие, а что этот проект продержится долго - я очень сомневался.
Однако во всем виновато FOMO, которое нагоняли телеграм-каналы, показывая как то один то другой бот зарабатывали свой профит на этом проекте. Поэтому еще в течение нескольких дней возвращался к анализу. И выяснил такую закономерность: большинство ботов гонятся за новыми пользователями. Но никто не гонится за "пользователями-неудачниками".
Условно, пользователь регистрируется в проекте, и бот моего конкурента выкупает его акции. Проходит какое то время (1-2-3 дня) и акции этого пользователя никто больше не покупает (то есть владельцу бота тупо некому их перепродать, чтобы заработать). Чтобы не лочить баланса в таком вот "неудачнике" - бот конкурента продает эти акции. И пользователь остается со своей 0 акцией. Мой бот мониторил появление таких пользователей. И выкупал их акции за минимальную цену. Логика тут была вот в чем: то ли другие боты, то ли другие пользователи, видели движение на таких "неудачниках" и понемногу тоже закупали их. Да, какое-то количество акций все же было пустышками, и их никто не брал. Но процентов 90, хотя бы 1 акция сверху покупалась другим пользователем и я выходил в ноль. Довольно часто другие пользователи закупали большее количество акций (до целых эфиров к сожалению не доходило, но до условных 0.05 эфира за акцию - было достаточно много). Учитывая, что стоимость газа в августе/сентябре была на самом низком уровне, то и расходы на комиссии (которые тоже задавались вручную ботом) выходили минимальными.
На текущий момент для меня эта схема не актуальна (хотя, не исключаю, что и сейчас из нее можно вытащить что-то интересное). По доходу, примерно за месяц работы бота вышло от 7 до 10к$ (+ еще несколько тысяч акций все еще лежат на аккаунте + не забываем про обещанный airdrop, хоть там и минимальное количество поинтов, так как за акции-пустышки давали совсем крохи)
Заряд мотивации получен? Двигаемся дальше.
Если вы уже преисполнились в сознании, хотите прокачать мозг и качество кода, то вы можете порешать алгоритмы на сайтах:
https://leetcode.com/, https://www.hackerrank.com/, https://www.codewars.com/.
Эти сайты используют люди, которые готовятся к алгоритмическому собеседованию в FAANG (Facebook, Amazon, Apple, Netflix и Google). На сайтах есть задачи разного уровня сложности.
Работа с сетью и API
Почти все библиотеки для работы с web3 просто отправляют HTTP-запросы для получения/изменения данных (отправка транзакции, получение рыночных данных, логин на сайте и т.п.). Поэтому чтобы достичь просветления придётся разобраться с тем, как работает сеть. Минимальный минимум:
- В чём отличие GET запроса от POST запроса (как передаются параметры и заголовки в запрос).
- Как отправить нужный запрос и обработать полученный ответ с помощью выбранного вами языка программирования.
Какие именно запросы и куда их отправлять обычно прописывается в документации. Сразу же пример: в документации binance вы можете найти url, на который слать запрос и endpoint для получения параметров. Благодаря этой информации, вы можете отправить обычный GET запрос (браузер их отправляет, когда вы в адресную строку что-то вводите), который покажет вам стакан в текущую секунду: https://api.binance.com/api/v3/depth?symbol=BTCUSDT. В данном запросе мы передаём параметры после знака "?". Все параметры можно найти в документации. Например, давайте ограничим глубину стакана и поменяем тикер: https://api.binance.com/api/v3/depth?symbol=ETHUSDT&limit=3. Так как это GET запрос, вы можете отправить его с помощью браузера, просто перейдя по ссылке - обязательно попробуйте!
Как вы видите, ничего сложного тут нет. Если вы напишете код, который будет отправлять все запросы из документации, то вы получите готовую библиотеку. Именно таким образом были написаны 99% библиотек под web3.
Углубление в блокчейн.
Если вам нравится понимать все процессы изнутри, то вам поможет Ortomich и его канал. На канале вы найдёте для себя огромное количество полезной информации. MUST HAVE.
Роадмап не такой большой, так как в web3 правда не надо так много знать, чтобы с ним работать, и это большой плюс для начинающих.
Я намеренно не стал включать в роадмап миллион ресурсов, так как считаю, что подписка на 100 кодерских каналов не делает вас кодером. Но если вам хочется во всём этом покопаться, то советую начать с этих двух статей с агрегированной информацией. первая, вторая.
Какие использовать источники для обучения разработки?
В первую очередь, всегда гугл и документация. Есть одно старинное правило: “Если появился вопрос, сначала открой гугл и попробуй найти ответ. Если не получилось, то ищи ответ в документации и только если там и там голяк, спроси у человека”. На сегодняшний день это не самое актуальное правило, так как кроме гугла и документации еще есть chatGPT и github. Но главную суть это правило передаёт.
Работа с github. Поиск чужих софтов, взятие best practices
Если с гуглом, документацией и chatGPT всё понятно, то github для многих будет неочевидным источником информации. Если провести аналогию, то github - это твиттер для кодеров. Если вы занимаетесь ресерчем профессионально, то вы 100% используете twitter, а не просто читаете tg-каналы. В кодинге всё то же самое. На github есть поиск по ключевым словам, и вы можете найти код с готовым решением и просто адаптировать его под себя.
chatGPT
chatGPT - очень классная вещь в бою. Думаю уже все знают, но эта прекрасная разработка может написать вполне приемлемый код полностью за вас. Проблема именно в подходе (промпты и т.д.)
Вот несколько тейков к обучению через chatGPT:
- Это ваш условно бесплатный ментор. С помощью chatGPT можно писать полноценные скрипты без знаний в программировании. Получать готовые скрипты, конечно, хорошо, но намного лучше хоть немного понимать что делает этот скрипт и как его улучшить. В данном случае chatGPT выступает в роли ментора, который готов отвечать на любое количество ваших вопросов 24/7. Если вам кажется, что вопрос глупый, то chatGPT вас не осудит (хороший ментор тоже). Поэтому с его помощью вы можете дойти до любого уровня понимания даже с самого нуля.
- Имейте цель. Когда у вас есть проблема, задача или четкая цель, ваше обучение пойдёт быстрее и продуктивнее. Если нет чёткой цели, то просто попросите chatGPT составить вам план обучения с практикой.
- Обновитесь до версии chatGPT 4. С кодом он работает в разы лучше chatGPT 3.5 и может обрабатывать намного больше информации (при необходимости можно просто скормить ему документацию проекта).
- Не забывайте про мирское. А именно про классические документации и гугл. Да, вы можете скормить доку чату, но иногда будет полезно самостоятельно прочитать документацию или что-то загуглить. Возможно гугл вам даст более актуальный ответ или в документации вы найдёте более элегантный способ решения. Помните, роботы тоже могут ошибаться.
- Разберитесь с основными понятиями. Перед тем, как создавать скрипт через chatGPT, разберитесь с базовыми понятиями сферы, с которой хотите работать. В случае с web3, вам нужно понимать что такое как минимум следующее: abi, смарт контракт, read/write методы, decimals, rpc и т.п.
- Больше информации. Если вы уже работали с кодом, то понимаете, что компьютеру нужно всё объяснять на максимально низком уровне. сhatGPT - это тоже код, поэтому когда вы задаёте ему вопрос, дайте максимальное количество входных данных. chatGPT не сможет выполнить запрос "напиши пайтон скрипт на свап woofi USDT ETH", ему нужно дать больше вводных данных - abi контракта, сам контракт и т.д.
cryppi около полугода назад брал интервью у человека, который научился кодить исключительно через chatGPT. Прочитайте, очень полезно.
Видео роадмап.
Мы записали подробное видео по данному роадмапу.
Последний пункт роадмапа.
Прочитал весь роадмап? Отлично. Теперь подпишись сюда - https://t.me/how_to_code_web3. Этот канал поможет тебе в твоём обучении кодингу.
Если вы не хотите тратить кучу времени и денег на самостоятельное обучение, то есть решение для вас. Мы запустили совместный курс по web3 автоматизации. Следующий поток будет - 2024, март-апрель. Следить за анонсами можно в данном канале. Подпишитесь!
Практическая часть: разбор WooFi свапа
Эту часть статьи стоит воспринимать, как первые несколько шагов в сторону web3 разработки. Возможно, что некоторые моменты будут ясны не на 100%, но отнеситесь к этому как к очередному поводу улучшить свои навыки гугления.
- Если вы имеете навыки в программировании, но нет опыта в работе с web3, эта часть будет для вас отличным и понятным гайдом.
- Если вы новичок в кодинге, то после прочтения этой части, вы поймёте, что в разработке под web3 нет ничего сложного.
Мы будем делать транзакцию свапа ETH в USDC в сети Arbitrum на сайте WooFi. Я выбрал именно эту транзакцию, так как в ней нет никаких подводных камней. Если какие-то слова или фразы будут непонятны в инструкции, попробуйте загуглить их значение или спросите в чате.
Для реализации задачи будет использоваться язык python, повторю ещё раз, так как на нём есть очень удобная библиотека для взаимодействия с web3, а именно web3.py. А во-вторых, python - один из самых популярных языков для автоматизации web3 процессов.
И ещё, код для EVM-сетей в 98% случаев одинаковый, обычно разница лишь в RPC-шке. К примеру, код, написанный для Arbitrum, идентичен коду, написанному под Ethereum. НО! Всегда есть те самые 2%, которые вылезают при каких-то узконаправленных задачах. Например, в Arbitrum нет мемпула, а в Ethereum - есть.
Код будет написан на языке python, но в остальном алгоритм разработки можно применять для других языков программирования (например для JavaScript с библиотекой Ethers.js или web3.js).
1. Python обрёл свою популярность не только благодаря своей простоте и удобству. Этому сильно поспособствовали энтузиасты, которые разрабатывали так называемые библиотеки (они же модули, они же фреймворки), которые расширили возможности языка и позволяли применять его для широкого спектра задач. Библиотека web3.py не входит в список стандартных библиотек и её нужно установить отдельно.
Сторонние библиотеки для python устанавливаются с помощью одной простой команды:
pip install название_библиотеки
Но тут есть нюанс: если у вас на компьютере установлен python2 (поддержка прекратилась в 2020 году) и python3 одновременно (возможно, вы даже не устанавливали python2, он может идти, как стандартное приложение), то команда pip
будет устанавливать библиотеки для python2. Чтобы библиотеки ставились для python3, придётся использовать команду:
pip3 install название_библиотеки
Если вы уверены, что в вашей системе есть только python3, то можете смело использовать pip
.
Но если вы хотите сделать всё профессионально, то советую использовать "виртуальное окружение". Виртуальное окружение Python - это изолированное цифровое пространство, в котором вы можете установить свои собственные версии Python и пакеты, отличные от тех, которые установлены в системе. То есть для каждого проекта вы можете создавать собственное виртуальное окружение, чтобы работать с нужной версией python и не захламлять систему кучей библиотек. Очень советую подробно разобраться с виртуальным окружением и активно его использовать. В этой статье на хабре вы найдёте все ответы на вопросы.
В примере будет использоваться библиотека web3.py. Чтобы её установить выполните команду:
pip install web3
2. Чтобы взаимодействовать с блокчейном (получать информацию, отправлять транзакции), нужно к нему подключиться. Подключение идёт через RPC блокчейна, к которому хотим подключиться. На сайте https://chainlist.org/ можно найти подходящую RPC. В столбце RPC Server Address находится сам url адрес, по которому будет происходить подключение. В столбце Latency находится пинг (чем меньше, тем лучше). В столбце Privacy, при наведении мышки (обязательно наведите и прочитайте), вы можете увидеть информацию о том, собирает нода данные или нет (желательно, чтобы не собирала). Если вы новичок, то можно не заморачиваться и взять любую RPC.
Но использовать свою RPC НАМНОГО ЛУЧШЕ, у нас на проектах постоянно скрипты отваливались из-за публичных кривых RPC, а мы голову ломали, что могло произойти. В идеале - своя нода, если нет возможности, то юзайте сервисы типа Alchemy, Ankr и т.д. (загуглите "RPC провайдеры")
С помощью кода ниже мы подключаемся к блокчейну. Также мы получаем переменную w3, с которой будем взаимодействовать с блокчейном.
from web3 import Web3 arbitrum_rpc = 'https://rpc.ankr.com/arbitrum/' w3 = Web3(provider=Web3.HTTPProvider( endpoint_uri=arbitrum_rpc ))
3. Ещё нам потребуется переменная для управления нашим аккаунтом (кошельком). С помощью этой переменной мы будем подписывать транзакции и взаимодействовать с нашим кошельком. Для этого нужно предварительно получить приватный ключ из кошелька.
private_key = '' account = w3.eth.account.from_key(private_key=private_key)
4. Следующий шаг: сделать транзакцию через кошелек и открыть её в любом сканере (в случае arbitrum, это https://arbiscan.io/)
- To - на какой контракт отправлена транзакция
- Value - сколько нативной монеты отправили с транзакцией
- Input Data - название функции и параметры, с которыми была отправлена транзакция
Можно декодировать Input Data с помощью кнопки Decode Input Data и посмотреть на параметры в человеческом виде.
Name - название параметра (берётся из abi);
Type - тип данных у переменной;
Есть несколько способов разобраться в том, что означает каждый из параметров.
- Просто по логике. Обычно, по названию переменных и по их значению можно догадаться, что они означают.
- Найти документацию к проекту с описанием методов.
- Найти на гите готовое решение и подсмотреть реализацию оттуда.
fromToken - токен, который будем свапать (ETH)
toToken - токен, на который будем свапать (USDC)
fromAmount - сколько ETH (в данном случае) будем свапать
minToAmount - сколько мы должны получить второго токена (USDC)
to - на какой адрес зачислить токены (адрес нашего кошелька)
rebateTo - тут тоже адрес нашего кошелька (на скрин не поместился этот параметр)
5. Подготовить все данные о контрактах. У каждого контракта есть адрес и ABI.
ABI - это по сути список всех функций и их параметров, которые есть в контракте.
Для начала получим данные о контракте USDC.
- Открываем в сканере контракт USDC, получаем адрес
Здесь копируем abi и сохраняем его в json файл в нашей программе.
Я у себя создал файл data/abis/default_token.json. Назвал файл default_token, так как 99.9% токенов реализуют интерфейс ERC-20 (фраза для гугления), и поэтому abi будет совпадать.
Также я советую перед тем, как вставлять abi в файл, прогнать его через сайт https://jsonformatter.curiousconcept.com, чтобы привести его в читабельный вид.
6. Вернемся к коду и занесём полученную информацию в строчки кода:
import json usdc_contract_address = Web3.to_checksum_address('0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8') usdc_contract_abi = json.load(open('data/abis/default_token.json')) usdc_contract = w3.eth.contract(address=usdc_contract_address, abi=usdc_contract_abi) woofi_contract_address = Web3.to_checksum_address('0x9aEd3A8896A85FE9a8CAc52C9B402D092B629a30') woofi_contract_abi = json.load(open('data/abis/woofi.json')) woofi_contract = w3.eth.contract(address=woofi_contract_address, abi=woofi_contract_abi)
Пара слов о том, что тут произошло.
Мы используем функцию Web3.to_checksum_address()
из библиотеки web3.py. Данная функция по сути приводит адрес в правильный регистр (автоматически определяет, какие буквы должны быть строчными, а какие заглавными).
Далее мы открываем и читаем файл с abi с помощью функции open()
. Прочитанный файл попадает в функцию json.load()
для того чтобы автоматически подогнать под json формат.
Ну и в последнюю очередь мы создаём “пульт управления” контрактом с помощью функции w3.eth.contract()
.
Также кроме контракта USDC я добавил данные о контракте WooFi. Помните, мы выше рассматривали транзакцию, отправленную ручками через метамаск? Нам нужен параметр “to”. Этот параметр хранит информацию о том, на какой контракт ушла транзакция. Заходим в этот контракт и повторяем те же манипуляции, что и с USDC контрактом (вставляем адрес контракта в код, а abi контракта кладём в новый файл data/abis/woofi.json)
7. Теперь накинем несколько переменных:
eth_address = Web3.to_checksum_address('0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE') eth_price = 1905 eth_amount = 0.0006 eth_decimals = 18 slippage = 0.5 min_to_amount = eth_price * eth_amount * (1 - slippage / 100)
eth_address
- адрес токена для свапа. В данном случае свап идёт ETH -> USDC, поэтому здесь прописываем адрес ETH (так как ETH это coin, а не token, у него нет контракта и адрес можно подсмотреть в транзакции, отправленной через UI). В принципе, сюда можно вставить любой токен, который можно свапнуть на WooFi, но предварительно токен нужно будет апрувнуть (ETH апрувать не надо).
eth_price
- цена эфира (этот параметр будет описан в последнюю очередь)
eth_amount
- количество эфира для свапа.
eth_decimals
- decimals. Лучше подгуглить что это. Но если коротко, то блокчейн не работает с дробными числами. Поэтому все числа переводятся в целые с помощью decimals. Перевод происходит следующим образом: если у нас есть 0.0006 ETH, а decimals = 18, то в блокчейн нужно передать число
0.0006 * 10^decimals = 0.0006 * 10^18 = 600000000000000.
slippage
- slippage, который используется во всех свапалках (я указываю в процентах).
min_to_amount
- тут мы считаем, сколько должны получить USDC в худшем случае. Если свапалка не сможет обеспечить нам данное количество USDC, транзакция зафейлится (чтобы понять, как я считаю, советую подставить цифры в формулу и посмотреть что будет).
eth_price
- цена эфира (цену лучше получать по API динамически. Но для упрощения кода я её захардкодил - слово для гугления). В разделе "Работа с сетью и API" мы уже видели, как можно получить стакан с бинанса. Из этого стакана вы можете получить цену эфира и вставить сюда: https://api.binance.com/api/v3/depth?symbol=ETHUSDT&limit=1 (запрос можно отправить с помощью библиотеки requests. Библиотека requests не входит в стандартные библиотеки, поэтому её нужно будет установить с помощью команды pip install requests
). Документация: https://pypi.org/project/requests/
import requests response = requests.get('https://api.binance.com/api/v3/depth?symbol=ETHUSDT&limit=1') result = response.json() # {'lastUpdateId': 27742986143, 'bids': [['2015.92000000', '69.07030000']], 'asks': [['2015.93000000', '59.91760000']]} eth_price = result['asks'][0][0] # '2015.93000000' обратите внимание, что тут строка
8. decimals для USDC получим прямо из контракта:
Справка: У нативной монеты нет контракта и поэтому мы захардкодили значение decimals (в данном случае, в сети Arbitrum у ETH decimals = 18).
Decimals у контрактов может отличаться, поэтому мы его не хардкодим, а получаем напрямую из контракта.
С помощью такой конструкции мы можем вызывать READ функции контракта.
usdc_decimals = usdc_contract.functions.decimals().call() # 6
functions
- атрибут контракта, с помощью которого мы можем обратиться ко всем функциям.
decimals
- название вызываемой функции (в скобки передаём параметры, если надо. На скриншоте видно, что функция не принимает параметры).
9. Переведём eth_amount в целое число. И то же самое проделаем с USDC:
eth_amount = int(eth_amount * 10 ** eth_decimals) usdc_amount = int(min_to_amount * 10 ** usdc_decimals)
10. Теперь мы готовы указать все аргументы транзакции
tx_args = woofi_contract.encodeABI('swap', args=( eth_address, usdc_contract.address, eth_amount, usdc_amount, account.address, account.address, ))
Функция encodeABI() первым аргументом принимает название WRITE функции, которую хотим вызвать. Вторым аргументов принимает список или кортеж (советую кортеж) аргументов транзакции.
11. Подготовим транзакцию к отправке в блокчейн
tx_params = { 'chainId': w3.eth.chain_id, 'gasPrice': w3.eth.gas_price, 'nonce': w3.eth.get_transaction_count(account.address), 'from': account.address, 'to': woofi_contract.address, 'data': tx_args, 'value': eth_amount }
Это стандартные параметры, которые будут совпадать в любой транзакции.
from
- адрес кошелька, с которого отправляется транзакция
to
- адрес контракта, куда отправляется транзакция
data
- закодированные названия функции и аргументы с помощью функции encodeABI()
value
- сколько нативной монеты отправили с транзакцией (при свапе нативной монеты обычно совпадает с её количеством). Если value в транзакции 0, то можно его не включать в этот словарь.
P.S. Здесь мы отправляем Legacy транзакцию и они будет немного отличаться от транзакции, отправленной через кошелёк. Правильнее было бы отправить EIP-1559 транзакцию. Это делается достаточно просто (пару ключей словаря заменить надо). Как это сделать я подробно рассказывал в этом видео.
tx_params['gas'] = w3.eth.estimate_gas(tx_params)
Газ рассчитывается автоматически с помощью функции w3.eth.estimate_gas()
. В функцию мы передаём параметры нашей транзакции. А результат работы функции добавляем в словарь tx_params
по ключу gas
.
Это одна из самых полезных функций, так как если вы неправильно указали параметры, все ошибки вы увидите именно в этот момент и не потратите деньги. А если газ в этот момент посчитался правильно, то можно пробовать запустить транзакцию.
13. Подписываем транзакцию приватным ключом и отправляем
sign = w3.eth.account.sign_transaction(tx_params, account.key) tx = w3.eth.send_raw_transaction(sign.rawTransaction)
Тут даже не о чем говорить. Всё происходит автоматически с помощью встроенных функций w3.eth.account.sign_transaction()
и w3.eth.send_raw_transaction().
14. Ждём выполнения транзакции
tx_data = w3.eth.wait_for_transaction_receipt(tx, timeout=200)
timeout
поставил 200 (указывается в секундах). Этого времени должно хватить для 99% транзакций.
15. Проверяем статус транзакции и выводим результат статус транзакции и её хеш в консоль
if 'status' in tx_data and tx_data['status'] == 1: print(f'transaction was successful: {tx.hex()}') else: print(f'transaction failed {tx_data["transactionHash"].hex()}')
import requests from web3 import Web3 import json private_key = '' arbitrum_rpc = 'https://rpc.ankr.com/arbitrum/' w3 = Web3(provider=Web3.HTTPProvider( endpoint_uri=arbitrum_rpc )) account = w3.eth.account.from_key(private_key=private_key) usdc_contract_address = Web3.to_checksum_address('0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8') usdc_contract_abi = json.load(open('data/abis/default_token.json')) usdc_contract = w3.eth.contract(address=usdc_contract_address, abi=usdc_contract_abi) woofi_contract_address = Web3.to_checksum_address('0x9aEd3A8896A85FE9a8CAc52C9B402D092B629a30') woofi_contract_abi = json.load(open('data/abis/woofi.json')) woofi_contract = w3.eth.contract(address=woofi_contract_address, abi=woofi_contract_abi) eth_address = Web3.to_checksum_address('0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE') # todo: данный функционал нужно вынести в функцию, но для упрощения кода оставили здесь response = requests.get('https://api.binance.com/api/v3/depth?symbol=ETHUSDT&limit=1') result = response.json() eth_price = result['asks'][0][0] eth_amount = 0.0006 eth_decimals = 18 slippage = 0.5 min_to_amount = eth_price * eth_amount * (1 - slippage / 100) usdc_decimals = usdc_contract.functions.decimals().call() eth_amount = int(eth_amount * 10 ** eth_decimals) usdc_amount = int(min_to_amount * 10 ** usdc_decimals) tx_args = woofi_contract.encodeABI('swap', args=( eth_address, usdc_contract.address, eth_amount, usdc_amount, account.address, account.address, )) tx_params = { 'chainId': w3.eth.chain_id, 'gasPrice': w3.eth.gas_price, 'nonce': w3.eth.get_transaction_count(account.address), 'from': account.address, 'to': woofi_contract.address, 'data': tx_args, 'value': eth_amount } tx_params['gas'] = w3.eth.estimate_gas(tx_params) sign = w3.eth.account.sign_transaction(tx_params, account.key) tx = w3.eth.send_raw_transaction(sign.rawTransaction) tx_data = w3.eth.wait_for_transaction_receipt(tx, timeout=200) if 'status' in tx_data and tx_data['status'] == 1: print(f'transaction was successful: {tx.hex()}') else: print(f'transaction failed {tx_data["transactionHash"].hex()}')
В этом примере мы рассмотрели как написать код для автоматизации свапа ETH → USDC на WooFi. Пример иллюстрирует, как работать с блокчейном, а именно, где брать всю необходимую информацию, как обращаться к READ и WRITE функциям контракта и как отправить и проверить транзакцию.
Для практики советую попробовать написать обратный свап USDC → ETH. В этом примере перед отправкой транзакции нужно будет сделать транзакцию approve.
Эти знания позволят вам по аналогии автоматизировать множество действий с вашего кошелька, но остаётся еще куча подводных камней, об которые можно запнуться.
Возможно, было немного сложно для первого раза, но... Не забывайте гуглить непонятные моменты, а также любые вопросы вы можете смело задать в чате.
Заключение
Под заключение не хочется писать что-то уникальное. Закончим тем, чем и начали...
Статья в спокойном темпе прочитывается за 1-2 часа, и после неё вы должны понять, хотите ли двигаться дальше в этом направлении. Стать кодером после прочтения - невозможно. Цель статьи - заинтересовать вас в кодинге. И мы даём для этого все ресурсы и наставления. В идеале растягивать эту статью на 2-3 месяца и скрупулёзно изучать каждую строчку, переходить по каждой ссылке и выполнять каждый пункт из нашего роадмапа. И только после этого вы можете считаться начинающим кодером.
И помните, самое главное - иметь цель. Бездумно изучать функции, рекурсии - это, конечно, хорошо, но абсолютно юзлесс. У кого-то цель - вынести проект. У кого-то цель - написать антидрейнер. У кого-то цель - написать ультимативный софт под Linea Квесты. Не забывайте про цель.
Если будет сложно и непонятно, то не тильтуйте. Во-первых, не всем быть кодерами. Я (криптапиражок), например, не умею кодить на хорошем уровне, это мне и не нужно. Я просто окружил себя талантливыми людьми. Во-вторых, я уже писал, эта статья на 2-3 месяца. Что-то непонятно? Гуглите или спрашивайте по чатам.
С вами были cryppi и Ahillary. Подписывайтесь на нас. Говорят, мы что-то подготовили для вас для более эффективного изучения программирования.
Под самый конец напишем лишь следующее:
Вот линк на роадмап, ближайшие 2-3 месяца вы должны жить по нему.
И да, после дропа статьи мы провели набор на наше обучение по web3 автоматизации на Python. Следующий поток будет в марте-апреле. Как узнать о старте? Подпишись на канал - https://t.me/how_to_code_web3