Транзакции | Python Оптимизация
Сегодня разбрем как отпралять транзакции с помощью скриптов на Python
1. Настройка Окружения
Подробная Инструкция t.me/code_vartcall/566
2. Что Необходимо Для Отправки Транзакции?
Web3-Кошелек - Metamask | TrustWallet | Zerion | etc
Адрес отправителя и получателя: два Ethereum-адреса в формате checksum.
Приватный Ключ - Для подписания транзакции и доступа к кошелька отправителя
Сумма перевода: для эфира указывается в wei, для токенов (в их минимальных единицах)
Nonce: количество отправленных транзакций с адреса отправителя (для предотвращения повторных транзакций)
Gas: максимальное количество газа, которое транзакция может использовать.
Gas Price: цена за единицу газа; определяет приоритет транзакции.
upd: как получить приватный ключ - youtube.com/watch?v=iLCl15n_MII
3. Код
from web3 import Web3
from web3.exceptions import TransactionNotFound, TimeExhausted
infuraUrl = "https://sepolia.infura.io/v3/вашInfuraКлюч"
web3 = Web3(Web3.HTTPProvider(infuraUrl))
if web3.is_connected():
print("Connected to Ethereum network")
sender_address = "0xАдресОтправителя"
final_sender_address = web3.to_checksum_address(sender_address)
print(f"Sender address: {final_sender_address}")
receiver_address = "0xАдресПолучателя"
print(f"Receiver address: {receiver_address}")
final_receiver_address = web3.to_checksum_address(receiver_address)
private_key = "приватныйКлючВашегоКошелька"
nonce = web3.eth.get_transaction_count(final_sender_address)
# создаем транзакцию
tx = {
'nonce': nonce,
'to': final_receiver_address,
'value': web3.to_wei(0.01, 'ether'),
'gas': 21000,
'gasPrice': web3.to_wei('50', 'gwei'),
}
# подписать транзацию
signed_tx = web3.eth.account.sign_transaction(tx, private_key)
try:
tx_hash = web3.eth.send_raw_transaction(signed_tx.raw_transaction)
# get the transaction hash
print(f"Transaction hash: 0x{tx_hash.hex()}")
receipt = web3.eth.wait_for_transaction_receipt(tx_hash, timeout=120)
if receipt.status == 1:
print("Transaction successful ✅")
else:
print("Transaction failed")
except (TransactionNotFound, TimeExhausted) as e:
print(f"Transaction failed: {str(e)}")
else:
print("Failed to connect to Ethereum network")4. Анализ
python файл.py
после проведения транзакции вы получите хеш-транзакции в формате 0xВашХеш
Проверить Транзакцию далее можно на sepolia.etherscan.io указав ваш хеш транзации
Про скрипт (как выполнялась транзакция):
- Подключились с блокчейну через Infura
- Определили адреса отправителя и получателя (+ преобразовали их в checksum формат)
- Определили приватный ключ отправителя
- Получили nonce для отправителя (получается количество транзакций, отправленных с адреса отправителя, для предотвращения повторных транзакций)
- Создание Транзакции через хеш-таблицу tx с ее транзакции: адрес получателя, сумма перевода, лимит газа и цена газа.
- Подписание Транзакции signed_tx через приватный ключ отправителя
- Отправка транзакции и обработка ошибок в try: except блоке
Подписанная транзакция отправляется в сеть. Скрипт ожидает получения квитанции о транзакции и проверяет её статус. В случае ошибок (например, транзакция не найдена или истекло время ожидания) выводится сообщение.
Время ожидания прописано в receipt (timeout = 120) - ждем 120 секунд
Также в скрипте я использовал "raw transaction" (сырая транзакция) - это транзакция, которая была подготовлена, но ещё не подписана.
Она содержит все необходимые данные включая: адреса отправителя и получателя, сумму перевода, количество газа, цену газа и другие параметры
После подписания приватным ключом отправителя такая транзакция становится подписанной и готовой к отправке в сеть Ethereum.
Теперь мы научились отправлять транзакции между кошельками. Все обновления и следующие уроки в моем телеграм-канале - t.me/code_vartcall