December 8, 2024

Автоматизация действий в блокчейне с помощью Python

Введение

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

Необходимые инструменты

Для работы нам понадобятся следующие библиотеки:

  • web3.py - для взаимодействия с EVM-совместимыми блокчейнами
  • python-dotenv - для безопасного хранения приватных ключей
  • requests - для работы с API
  • asyncio - для асинхронного выполнения операций

Настройка окружения

from web3 import Web3
from eth_account import Account
import json
import os
from dotenv import load_dotenv
import asyncio
import requests

# Загружаем переменные окружения
load_dotenv()

# Подключаемся к сети (например, Ethereum)
w3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/YOUR-PROJECT-ID'))

# Загружаем приватный ключ из переменных окружения
private_key = os.getenv('PRIVATE_KEY')
account = Account.from_key(private_key)

Основные операции

1. Отправка транзакций

async def send_transaction(to_address, value_in_ether):
    # Получаем nonce
    nonce = w3.eth.get_transaction_count(account.address)
    
    # Создаем транзакцию
    transaction = {
        'nonce': nonce,
        'to': to_address,
        'value': w3.to_wei(value_in_ether, 'ether'),
        'gas': 21000,
        'gasPrice': w3.eth.gas_price,
        'chainId': 1  # 1 для mainnet
    }
    
    # Подписываем транзакцию
    signed_txn = w3.eth.account.sign_transaction(transaction, private_key)
    
    # Отправляем транзакцию
    tx_hash = w3.eth.send_raw_transaction(signed_txn.rawTransaction)
    
    # Ждем подтверждения
    receipt = w3.eth.wait_for_transaction_receipt(tx_hash)
    return receipt

2. Взаимодействие со смарт-контрактами

def interact_with_contract(contract_address, contract_abi):
    # Создаем экземпляр контракта
    contract = w3.eth.contract(address=contract_address, abi=contract_abi)
    
    # Пример чтения данных из контракта
    async def read_contract_data():
        balance = contract.functions.balanceOf(account.address).call()
        return balance
    
    # Пример отправки транзакции в контракт
    async def send_contract_transaction(to_address, amount):
        nonce = w3.eth.get_transaction_count(account.address)
        
        transaction = contract.functions.transfer(
            to_address,
            amount
        ).build_transaction({
            'nonce': nonce,
            'gas': 100000,
            'gasPrice': w3.eth.gas_price,
        })
        
        signed_txn = w3.eth.account.sign_transaction(transaction, private_key)
        tx_hash = w3.eth.send_raw_transaction(signed_txn.rawTransaction)
        receipt = w3.eth.wait_for_transaction_receipt(tx_hash)
        return receipt

3. Мониторинг событий

async def monitor_events(contract, event_name):
    event_filter = contract.events[event_name].create_filter(fromBlock='latest')
    
    while True:
        for event in event_filter.get_new_entries():
            print(f"Новое событие {event_name}:")
            print(event)
        await asyncio.sleep(2)  # Проверяем каждые 2 секунды

Практические примеры использования

1. Автоматический своп токенов на Uniswap

async def swap_tokens_uniswap(token_in, token_out, amount):
    # Адрес роутера Uniswap
    UNISWAP_ROUTER = "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D"
    
    # Загружаем ABI роутера
    with open('uniswap_router_abi.json') as f:
        router_abi = json.load(f)
    
    router_contract = w3.eth.contract(address=UNISWAP_ROUTER, abi=router_abi)
    
    # Получаем путь свопа
    path = [token_in, token_out]
    deadline = w3.eth.get_block('latest').timestamp + 300  # +5 минут
    
    # Получаем количество токенов на выходе
    amounts_out = router_contract.functions.getAmountsOut(amount, path).call()
    min_amount_out = int(amounts_out[1] * 0.995)  # 0.5% слиппаж
    
    # Создаем транзакцию свопа
    swap_txn = router_contract.functions.swapExactTokensForTokens(
        amount,
        min_amount_out,
        path,
        account.address,
        deadline
    ).build_transaction({
        'nonce': w3.eth.get_transaction_count(account.address),
        'gas': 200000,
        'gasPrice': w3.eth.gas_price
    })
    
    signed_txn = w3.eth.account.sign_transaction(swap_txn, private_key)
    tx_hash = w3.eth.send_raw_transaction(signed_txn.rawTransaction)
    return w3.eth.wait_for_transaction_receipt(tx_hash)

2. Автоматическое участие в IDO

async def participate_in_ido(ido_contract_address, amount):
    # Загружаем ABI IDO контракта
    with open('ido_abi.json') as f:
        ido_abi = json.load(f)
    
    ido_contract = w3.eth.contract(address=ido_contract_address, abi=ido_abi)
    
    # Проверяем, открыто ли IDO
    is_active = ido_contract.functions.isActive().call()
    if not is_active:
        return "IDO еще не началось или уже закончилось"
    
    # Создаем транзакцию для участия
    participate_txn = ido_contract.functions.participate().build_transaction({
        'nonce': w3.eth.get_transaction_count(account.address),
        'value': amount,
        'gas': 200000,
        'gasPrice': w3.eth.gas_price
    })
    
    signed_txn = w3.eth.account.sign_transaction(participate_txn, private_key)
    tx_hash = w3.eth.send_raw_transaction(signed_txn.rawTransaction)
    return w3.eth.wait_for_transaction_receipt(tx_hash)

Безопасность и лучшие практики

  1. Никогда не храните приватные ключи в коде
  2. Используйте .env файлы и переменные окружения
  3. Всегда проверяйте газ и слиппаж перед отправкой транзакций
  4. Имплементируйте обработку ошибок и логирование
  5. Используйте асинхронное программирование для эффективной работы
# Пример обработки ошибок
async def safe_transaction(func):
    try:
        result = await func()
        return result
    except Exception as e:
        print(f"Ошибка при выполнении транзакции: {str(e)}")
        # Добавьте логирование
        return None

Заключение

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

При разработке автоматизированных скриптов рекомендуется:

  • Тестировать скрипты в тестовой сети перед использованием в основной
  • Использовать системы мониторинга и оповещения
  • Регулярно обновлять используемые библиотеки
  • Внимательно проверять все параметры транзакций

Подпишись !!!

Спасибо за чтение ! Подпишись что бы не пропускать дальнейшие статьи!

Телеграм: https://t.me/one_eyes