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 receipt2. Взаимодействие со смарт-контрактами
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 receipt3. Мониторинг событий
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)Безопасность и лучшие практики
- Никогда не храните приватные ключи в коде
- Используйте .env файлы и переменные окружения
- Всегда проверяйте газ и слиппаж перед отправкой транзакций
- Имплементируйте обработку ошибок и логирование
- Используйте асинхронное программирование для эффективной работы
# Пример обработки ошибок
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