Cover photo

web3.py Cheatsheet

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

https://github.com/Nomzegh/web3py-cheatsheet


Web3 Cheatsheet - твой помощник в написании будущих скриптов для всех существующих EVM сетей.

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

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

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

post image

./payable-utilities: обычный трансфер, отмена транзакции, дисперс нативного токена, трансфер фулл баланса с приватников, транзакция типа eip1559, функции юнисвапа.

./nonpayable-utilities: декодинг транзакции, высчитывание всех газовых значений, генератор кастомных адресов, мониторинг пендинг транзакций, подпись сообщения.

./wallets: использование N к-ва приватных ключей с файла, генератор приватников в файл.


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

Payable Utilities - Платные инструменты

  • cancel_transaction.py - отмена зависшей предыдущей транзакции. Возвращает хеш транзакции.

    С помощью этого кода можно отменить pending транзакцию. Зачастую, транзакция “зависает“ в блокчейне из-за слишком малого gasPrice. По сути, код делает обычный пустой трансфер с tx[“value”]: 0 самому себе, поставив тот же nonce (порядок транзакции), что и у зависшей транзакции, но с gasPrice уже повыше.

    Зачем: был поставлен слишком малый gasPrice, и отправка следующих транзакций - невозможна.


  • native_transfer.py - пересыл нативного токена.

    Возвращает хеш транзакции. Самый обычный трансфер нативного токена от адреса A к адресу B. Тут ничего особенного.

    Зачем: это самый базовый трансфер, который пригодится нам везде.


  • disperse_native.py - пересыл нативного токена на адреса с disperse_addresses.txt. Возвращает хеши каждой транзакции.

    Использует обычный трансфер нативного токена от одного адреса к нескольким. Для работы нужно создать disperse_addresses.txt и поместить туда все адреса на которые нужно разделить токены. Наотмену от native_transfer.py, этот код не ожидает результата транзакции, поэтому заранее отправит все транзакции с nonce повыше. К сожалению, этот способ дисперса довольно топорный, и для абузов лучше подойдет вывод с биржи, но он будет дороже.

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


  • transfer_all_native.py - пересыл полного баланса нативного токена всех приватных ключей из private_keys.txt на один адрес.

    Для работы нужно создать private_keys.txt и поместить туда приватные ключи, с которых мы хотим снять фулл баланс. Довольно часто может пригодится в случаях, когда после какого-то абуза остается много приватников с мелким балансом, а выводить вручную супер затратно по времени. (Вот останется на 100 адресах по $0.1-$1 в каком-то BNB, а если вывести полный баланс, то уже +$10-$100, что довольно приятно.)

    Зачем: остался баланс на “заброшенных” приватниках после очередного абуза


  • eip1559_example.py - пример трансфер-транзакции типа eip-1559.

    Чем она отличается от транзакции типа Legacy? В Legacy мы устанавливаем комиссию через параметр gasPrice, и чем выше это значение - тем больше шанс что наша транзакция попадет в блок.В EIP-1559 у нас немного другие параметры: base fee (базовая комса которая сжигается)miner tip - “чаевые, взятка” для майнера. В коде мы вписываем два новых параметра вместо gasPrice: maxPriorityFeePerGas (вызываем через web.eth.max_priority_fee) и maxFeePerGas = base_fee + max_priority_fee. Этот тип транзакции пока самый актуальный, так что лучше использовать его вместо Legacy.

    Зачем: большинство DAPP использует именно этот тип транзакций, так что в абузах лучше использовать его, но Legacy транзы никто не отменял.


  • uniswap_functions.py - **пример нескольких функций на всем известном Uniswap.
    **
    Для начала нужно установить библиотеку Uniswap через команду:

    pip install uniswap-python
    

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

    Зачем: мы можем интегрировать свапы/парсинг цен в код, если нужно иметь дело с DEX обменниками.


Non-Payable Utilities - Бесплатные Инструменты

  • estimate_gas_values.py - пример как высчитывать следующие параметры: gas, gasPrice, baseFee, maxFeePerGas, maxPriorityFeePerGas

    Тут ничего сложного, просто функции которые возвращают каждое значение для Legacy и EIP-1559 транзакций. Так же, есть функция для вычисления всегда правильных значений tx[“gas”], чтобы никогда не столкнуться с ошибкой Out of gas.

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


  • vanity_generator.py - генератор адресов с кастомным префиксом.

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

    Дед инсайд? 0xdead
    Элитный криптоюзер? 0x1337
    Любитель кофе? 0xс0ffee
    Роняешь запад? 0xFACE
    …? 0xda7baeb
    Или же вы просто хотите блатные номера с 77777 в начале? 0x77777

    Все это можно сгенерировать с помощью этого кода, который еще и может работать через multiprocessing. Но имейте в виду, что чем длиннее кастом префикс вы хотите - тем дольше вы будете его генерировать. Так же, контроллируйте нагрузку процессора к-вом процессов. Доступные буквы A-F и цифры 0-9

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


  • sign_message.py - генератор подписи с помощью приватного ключа.

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

    Зачем: многие проекты используют логин через подпись текстового сообщения. Сигнатуру мы отправляем на их API и получаем access_token для различных действий.


  • web3_with_proxy.py - маленький пример использования прокси с web3py.

    Имея прокси в формате http://login:password@ip:port, мы можем создать некий слой соединения с помощью requests.session и начать делать наши транзакции. Можно сразу на месте проверить и работоспособность прокси, и подключились ли вы к web3.

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


  • decode_transaction.py - расшифровка txData любой транзакции.

    Практически всегда критически важно знать что именно нужно вписывать в параметры функции контракта N.
    Ключевым элементом расшифровки txData и отправки нормальных транзакций, является ABI (интерфейс) целого контракта или одной функции.
    Как же действовать в следующих ситуациях?

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

    Контракт проекта не верифицирован на скане.
    Тут не стоит расстраиваться, у вас еще есть шанс расшифровать свою транзакцию. Первым делом вбиваем в гугле первые символы (метод айди функции) нашей txData - к примеру 0xf340fa01. (Так же есть хороший инструмент - openchain.xyz)

    Если в поиске видны результаты с этой функцией, но на сканах других чейнов - просто заходим и копируем ABI этого контракта. Теперь вы можете коллить эту функцию в будущем, либо расшифровать свою транзакцию с помощью decode_transaction.py или через openchain.xyz.

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

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

    Зачем: имея ABI, нам важно знать что вписывалось в транзакцию в tx[“data”].


  • pending_tx_monitoring.py - мониторинг pending транзакций.

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

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

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

    Зачем: используется если важен момент и скорость отправки транзакции


Wallets - кошельки

  • multiple_keys_usage.py - небольшой пример использования нескольких приватных ключей с/без прокси.

    Для работы мы должны создать файлы private_keys.txt и proxies.txt (формат прокси следующий: login:password@ip:port). В случае, если вы хотите быстро спамить транзакциями с кучи кошельков - хорошим решением будет прикрутить asyncio, но об этом в другой раз.

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


  • simple_generator.py - самый обычный генератор новых кошельков.Запустив код, нам нужно указать количество желаемых кошельков, и в результате получим приватники и адреса, записанные в private_keys.txt и public_keys.txt соответственно.

    Зачем: нам нужно создать N количество кошельков для дальнейших использований.


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

https://t.me/roccrypto