Como Criar e Enviar Transação Bitcoin com Python Usando bitcoinlib
Sempre crie uma frase de segurança única para jogos, testnets ou airdrops e evite usar sua carteira principal.
Como Criar e Enviar Transação Bitcoin com Python Usando bitcoinlib
Este tutorial detalha como criar e preparar uma transação Bitcoin utilizando a biblioteca bitcoinlib em Python. Através deste exemplo prático, você aprenderá a consultar UTXOs, calcular taxas dinâmicas com base no último bloco minerado, construir a transação, calcular o troco e ajustar a taxa para garantir que a transação seja aceita pela rede Bitcoin.
Bibliotecas e dependências
Antes de começar, certifique-se de ter instalado as bibliotecas necessárias:
pip install bitcoinlib requests
Parâmetros principais do script
- WIF: Chave privada no formato Wallet Import Format do remetente.
- DESTINO: Endereço Bitcoin que receberá os fundos.
- VALOR_ENVIO: Valor a ser enviado em BTC. Se zero, o script envia todo o saldo disponível descontada a taxa.
Obter a taxa média do último bloco minerado
Para definir uma taxa justa e atualizada para a transação, o script consulta a API Blockchain.info para obter dados do bloco mais recente. Com isso, calcula a média da taxa paga por byte nas transações desse bloco.
Explicação do fluxo do script
- Consulta dos UTXOs: O script usa a API da Blockchain.info para obter os Unspent Transaction Outputs (UTXOs) do endereço de origem, que representam os fundos disponíveis para gastar.
- Criação da transação: Monta as entradas (inputs) baseadas nos UTXOs obtidos e adiciona a saída (output) para o endereço de destino.
- Cálculo do troco: Caso haja saldo restante, o valor do troco é enviado de volta para o endereço de origem.
- Ajuste da taxa: A taxa é recalculada dinamicamente com base no tamanho final da transação, garantindo que a rede aceite a transação rapidamente.
- Exibição da transação não assinada: Para fins didáticos, o script imprime a estrutura da transação, pronta para ser assinada e enviada à rede.
Exemplo completo do código em Python
from bitcoinlib.keys import Key
from bitcoinlib.transactions import Transaction
from decimal import Decimal
import requests
import json
# 🔐 Parâmetros do usuário
WIF = "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi4SWWqNAWKRpf1YVnSL5mY" # Chave privada WIF do remetente
DESTINO = "15ELiLBwTcuNnfyCmSD88gWNgprsPTLPke" # Endereço do destinatário
VALOR_ENVIO = Decimal("0") # Valor em BTC; zero para enviar todo saldo disponível
def obter_taxa_media_bloco():
url = 'https://blockchain.info/latestblock'
response = requests.get(url)
if response.status_code == 200:
last_block = response.json()
block_hash = last_block['hash']
url_block = f'https://blockchain.info/rawblock/{block_hash}'
response_block = requests.get(url_block)
if response_block.status_code == 200:
block_data = response_block.json()
total_fee = sum(tx['fee'] for tx in block_data['tx'])
total_size = sum(tx['size'] for tx in block_data['tx'])
return total_fee / total_size if total_size > 0 else 0
return 0
# Obter taxa média atual do bloco para cálculo da fee
taxa_media = obter_taxa_media_bloco()
print(f"Taxa média do bloco atual: {taxa_media:.2f} satoshis/byte")
# Valor estimado da taxa, considerando 250 bytes como tamanho inicial
FEE = int(taxa_media * 250)
# Conversão do valor de envio para satoshis
valor_satoshis = int(VALOR_ENVIO * 10**8)
# Criar chave a partir do WIF
key = Key(WIF)
# Endereço de origem derivado da chave privada
endereco_origem = key.address()
print(f"Endereço de origem: {endereco_origem}")
# Consulta UTXOs via API Blockchain.info
url = f'https://blockchain.info/unspent?active={endereco_origem}'
response = requests.get(url)
if response.status_code == 200:
utxos = response.json().get('unspent_outputs', [])
if not utxos:
print(f"Nenhum UTXO disponível no endereço {endereco_origem}.")
exit()
tx = Transaction()
total_value = 0
for utxo in utxos:
tx.add_input(utxo['tx_hash'], utxo['tx_output_n'], utxo['value'])
total_value += utxo['value']
if total_value == 0:
print("Saldo zero, não há o que enviar.")
exit()
# Se VALOR_ENVIO for 0, envia todo o saldo descontada a taxa
if valor_satoshis == 0:
valor_satoshis = total_value - FEE
tx.add_output(valor_satoshis, DESTINO)
valor_troco = total_value - valor_satoshis - FEE
if valor_troco > 0:
tx.add_output(valor_troco, endereco_origem)
tamanho_transacao = tx.size
print(f"Tamanho da transação: {tamanho_transacao} bytes")
FEE = int(taxa_media * tamanho_transacao)
print(f"Taxa ajustada: {FEE} satoshis")
print("Transação não assinada:")
print(json.dumps(tx.as_dict(), indent=4))
else:
print(f"Erro ao consultar UTXOs: {response.status_code} - {response.text}")
Considerações finais e responsabilidade
Importante: Sempre analise cuidadosamente qualquer operação com criptomoedas. Utilize chaves e fundos que você controla para testes e nunca compartilhe sua chave privada (WIF) com terceiros. Este exemplo é para fins educativos e não deve ser utilizado para transações financeiras reais sem as devidas precauções.

Comentários
Comente só assim vamos crescer juntos!