Web3-Python-Development
January 12

Транзакции | Python Оптимизация

Сегодня разбрем как отпралять транзакции с помощью скриптов на Python

План:

  1. Настройка Python-Окружения
  2. Что необходимо для отправки Транзакций
  3. Код
  4. Анализ

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 указав ваш хеш транзации

Про скрипт (как выполнялась транзакция):

  1. Подключились с блокчейну через Infura
  2. Определили адреса отправителя и получателя (+ преобразовали их в checksum формат)
  3. Определили приватный ключ отправителя
  4. Получили nonce для отправителя (получается количество транзакций, отправленных с адреса отправителя, для предотвращения повторных транзакций)
  5. Создание Транзакции через хеш-таблицу tx с ее транзакции: адрес получателя, сумма перевода, лимит газа и цена газа.
  6. Подписание Транзакции signed_tx через приватный ключ отправителя
  7. Отправка транзакции и обработка ошибок в try: except блоке

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

Время ожидания прописано в receipt (timeout = 120) - ждем 120 секунд

Также в скрипте я использовал "raw transaction" (сырая транзакция) - это транзакция, которая была подготовлена, но ещё не подписана.

Она содержит все необходимые данные включая: адреса отправителя и получателя, сумму перевода, количество газа, цену газа и другие параметры

После подписания приватным ключом отправителя такая транзакция становится подписанной и готовой к отправке в сеть Ethereum.


Теперь мы научились отправлять транзакции между кошельками. Все обновления и следующие уроки в моем телеграм-канале - t.me/code_vartcall

Всем Кода!

by Vartcall 12.01.2025