Python e Blockchain: Criando Smart Contracts Simples

Blockchain revolucionou a forma como armazenamos informações, permitindo transações seguras, transparentes e descentralizadas. Com o crescimento das aplicações descentralizadas (DApps), os smart contracts se tornaram essenciais, automatizando regras e executando código de forma confiável sem intermediários.

Python, embora não seja a linguagem nativa da maioria das blockchains (como Solidity no Ethereum), é uma ferramenta poderosa para:

  • Escrever scripts que interagem com blockchains

  • Testar contratos

  • Automatizar transações

  • Simular contratos simples

Neste post, vamos explorar como Python pode ser usado para criar e interagir com smart contracts, incluindo exemplos práticos, bibliotecas, ferramentas e boas práticas.


1. O que são Smart Contracts?

Smart contracts são programas que rodam em uma blockchain e executam regras automaticamente quando condições pré-definidas são atendidas. Características principais:

  • Imutabilidade: depois de publicado, o código não pode ser alterado.

  • Automação: executa transações sem intervenção humana.

  • Segurança: executado no ambiente descentralizado da blockchain.

  • Transparência: qualquer participante pode auditar o contrato.

Exemplos de uso:

  • Transferência de tokens automaticamente quando condições são atendidas.

  • Crowdfunding descentralizado.

  • Registro de ativos digitais (NFTs).

  • Sistemas de votação segura.


2. Blockchain e Python

Python não é a linguagem principal de smart contracts em blockchains públicas (como Ethereum, Binance Smart Chain), mas oferece ferramentas para:

  • Criar simulações de contratos em blockchain local.

  • Interagir com contratos Ethereum via Web3.py.

  • Automatizar transações, deploy e testes de contratos.

  • Criar blockchains privadas para aprendizado ou testes.

2.1 Bibliotecas Python relevantes

BibliotecaFunção
Web3.pyInteração com Ethereum e contratos Solidity
BrownieFramework para desenvolvimento e teste de smart contracts
eth-brownieDeploy, teste e interação local com Ethereum
py-solc-xCompilador de Solidity via Python
Ganache CLIBlockchain Ethereum local para testes

3. Criando uma blockchain simples em Python

Antes de mergulhar em smart contracts, vamos criar uma blockchain minimalista em Python para fins educativos:

import hashlib
import time
import json

class Block:
    def __init__(self, index, timestamp, data, previous_hash):
        self.index = index
        self.timestamp = timestamp
        self.data = data
        self.previous_hash = previous_hash
        self.hash = self.calc_hash()
    
    def calc_hash(self):
        block_string = f"{self.index}{self.timestamp}{self.data}{self.previous_hash}"
        return hashlib.sha256(block_string.encode()).hexdigest()

class Blockchain:
    def __init__(self):
        self.chain = [self.create_genesis_block()]
    
    def create_genesis_block(self):
        return Block(0, time.time(), "Genesis Block", "0")
    
    def add_block(self, data):
        prev_block = self.chain[-1]
        new_block = Block(len(self.chain), time.time(), data, prev_block.hash)
        self.chain.append(new_block)

# Testando a blockchain
bc = Blockchain()
bc.add_block({"from": "Alice", "to": "Bob", "amount": 50})
bc.add_block({"from": "Bob", "to": "Charlie", "amount": 25})

for block in bc.chain:
    print(vars(block))

Explicação:

  • Cada bloco tem hash próprio e referencia o bloco anterior.

  • Essa é uma base conceitual para entender como blockchain funciona.

  • Podemos adicionar contratos “simples” dentro do campo data.


4. Introdução a Smart Contracts em Ethereum com Python

4.1 Instalando Web3.py

pip install web3

4.2 Criando um contrato Solidity simples

Arquivo SimpleStorage.sol:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SimpleStorage {
    uint256 public storedData;

    function set(uint256 x) public {
        storedData = x;
    }

    function get() public view returns (uint256) {
        return storedData;
    }
}

Descrição:

  • storedData armazena um número.

  • set() atualiza o valor.

  • get() retorna o valor atual.

4.3 Compilando o contrato em Python

from solcx import compile_standard, install_solc
import json

install_solc("0.8.0")

with open("SimpleStorage.sol", "r") as file:
    simple_storage_file = file.read()

compiled_sol = compile_standard({
    "language": "Solidity",
    "sources": {"SimpleStorage.sol": {"content": simple_storage_file}},
    "settings": {"outputSelection": {"*": {"*": ["abi", "metadata", "evm.bytecode"]}}}
})

bytecode = compiled_sol['contracts']['SimpleStorage']['SimpleStorage']['evm']['bytecode']['object']
abi = compiled_sol['contracts']['SimpleStorage']['SimpleStorage']['abi']

5. Conectando a blockchain local com Web3.py

Para testes, use Ganache CLI (blockchain Ethereum local):

npm install -g ganache-cli
ganache-cli

Python script para deploy:

from web3 import Web3

w3 = Web3(Web3.HTTPProvider("http://127.0.0.1:8545"))
chain_id = 1337
my_address = "0xYourAddress"
private_key = "0xYourPrivateKey"

SimpleStorage = w3.eth.contract(abi=abi, bytecode=bytecode)

nonce = w3.eth.get_transaction_count(my_address)
transaction = SimpleStorage.constructor().buildTransaction({
    "chainId": chain_id,
    "from": my_address,
    "nonce": nonce,
    "gasPrice": w3.eth.gas_price
})

signed_txn = w3.eth.account.sign_transaction(transaction, private_key=private_key)
tx_hash = w3.eth.send_raw_transaction(signed_txn.rawTransaction)
tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash)

print("Contrato implantado em:", tx_receipt.contractAddress)

Explicação:

  • Deploy do contrato em blockchain local.

  • Retorna endereço do contrato para interações futuras.


6. Interagindo com o smart contract

simple_storage = w3.eth.contract(address=tx_receipt.contractAddress, abi=abi)

# Ler valor inicial
print("Valor armazenado:", simple_storage.functions.get().call())

# Atualizar valor
nonce = w3.eth.get_transaction_count(my_address)
tx = simple_storage.functions.set(42).buildTransaction({
    "chainId": chain_id,
    "from": my_address,
    "nonce": nonce,
    "gasPrice": w3.eth.gas_price
})
signed_tx = w3.eth.account.sign_transaction(tx, private_key=private_key)
tx_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction)
w3.eth.wait_for_transaction_receipt(tx_hash)

# Ler valor atualizado
print("Novo valor armazenado:", simple_storage.functions.get().call())

Dica criativa: você pode criar smart contracts simples para votação, crowdfunding ou registro de ativos digitais, tudo testável localmente com Python.


7. Boas práticas ao desenvolver smart contracts

  1. Teste localmente antes de deploy em rede principal.

  2. Evite loops infinitos ou operações caras (alto consumo de gas).

  3. Segurança: validação de inputs, prevenção de overflow e reentrancy attacks.

  4. Documente contratos: ABI, funções públicas e eventos.

  5. Versionamento: mantenha contratos e scripts Python versionados juntos para auditabilidade.


8. Extensões avançadas

  • Brownie Framework: automatiza testes, deploy e integração com Python.

  • Web3.py + Flask / FastAPI: crie APIs que interagem com contratos e disponibilize dados para aplicações web ou dashboards.

  • Testes automatizados com Pytest e contratos simulados: importante para contratos mais complexos.

  • Integração com front-end: React ou Vue.js + Web3.py backend para criar DApps completos.


9. Projeto exemplo completo

Objetivo: smart contract simples de votação.

  • Contrato Solidity: Voting.sol (candidatos, voto único por address).

  • Python: deploy local com Ganache, interação via Web3.py, contagem de votos.

  • Dashboards: Streamlit para mostrar resultados em tempo real.

  • Extras: validação de votos e registro em blockchain de teste para auditabilidade.

Estrutura sugerida:

python-blockchain/
├── contracts/
│   └── Voting.sol
├── scripts/
│   ├── deploy.py
│   └── interact.py
├── tests/
│   └── test_voting.py
├── frontend/
│   └── streamlit_dashboard.py
└── README.md

10. Conclusão

Python é uma ferramenta poderosa para aprendizado, testes e interação com smart contracts, mesmo que não seja a linguagem nativa da maioria das blockchains. Com bibliotecas como Web3.py, py-solc-x e Brownie, é possível:

  • Criar smart contracts simples

  • Testar e simular blockchains localmente

  • Automatizar deploy e interações

  • Integrar com dashboards e aplicações web

Próximos passos sugeridos:

  • Experimentar contratos de tokens ERC20 ou NFTs locais.

  • Criar API Python que expõe dados do contrato para front-end ou sistemas corporativos.

  • Explorar frameworks como Brownie para testes unitários de contratos complexos.

Comentários

Postagens mais visitadas deste blog

Gerando Relatórios em PDF com Python (ReportLab e FPDF)

Python para Computação Quântica: Introdução com Qiskit

Estrutura Básica de um Programa C# com exemplos