Como criar um Blockchain com Python?
Publicados: 2021-11-03Você sabia que o Bitcoin é construído sobre o Blockchain? Hoje vamos construir um Blockchain com Python do zero.
O que é Blockchain?
Em 2008, o jornal Bitcoin foi publicado por um indivíduo ou grupo desconhecido chamado Satoshi Nakamoto. O Bitcoin surgiu como uma versão ponto a ponto do dinheiro eletrônico que permitia transações sem passar por instituições centralizadas (bancos). A maioria das pessoas não sabe que nesse mesmo jornal Satoshi definiu uma forma distribuída de armazenamento de informações, hoje conhecida como Blockchain.

Para simplificar, o Blockchain é um livro-razão digital imutável e compartilhado que armazena transações em uma rede descentralizada de computadores.
Podemos dividir Blockchain em dois termos simples:
- Bloco: um espaço onde armazenamos transações
- Cadeia: um conjunto de registros vinculados
Isso define Blockchain como uma cadeia de blocos vinculados, onde cada bloco armazena uma transação feita com parâmetros específicos.
Cada bloco é construído em cima de outro bloco, criando uma cadeia irreversível de blocos. Em outras palavras, cada bloco depende do outro. Isso se transforma em um sistema robusto e imutável no qual qualquer pessoa com as permissões corretas pode revisar a integridade.
Blockchain apresenta um conjunto interessante de recursos:
- Imutabilidade da história
- Persistência de informação
- Sem erros com os dados armazenados
Muitos sistemas atualmente dependem do Blockchain, como criptomoedas, transferência de ativos (NFTs) e, possivelmente, em um futuro próximo, votação.
Vale a pena mencionar que um Blockchain Python não precisa ser um programa complexo com milhares de linhas de código. Em seu núcleo, seria uma lista de transações vinculadas umas às outras.
Claro, esta foi uma breve explicação, mas se você quiser um guia completo, produzimos um tutorial completo sobre Blockchain para iniciantes. Certifique-se de dar uma olhada.
Sem mais delongas, vamos construir um Blockchain simples com Python.
Construindo um Blockchain com Python
Antes de começar, vamos definir o que faremos neste tutorial:
- Construir um sistema Blockchain simples escrito em Python
- Use nosso Blockchain com transações pré-estabelecidas representadas como strings
- Teste a imutabilidade de nosso Blockchain
Não vamos usar JSON, mas listas Python. Isso nos permitirá simplificar o processo e focar na aplicação dos conceitos-chave de um Blockchain.
O que você precisa para seguir este tutorial:
- Compreensão de classes e métodos em Python
- Uso básico da linha de comando
Criando a classe Block
Abra seu editor de código favorito e crie um arquivo main.py. Este será o arquivo com o qual trabalharemos.
Agora, importe o hashlib, um módulo que nos permite criar mensagens criptografadas unilaterais. Técnicas de criptografia, como hashing, fazem o Blockchain criar transações seguras.
Uma função hash é um algoritmo que obtém alguns dados (geralmente uma string codificada) e retorna um identificador exclusivo, geralmente denominado "resumo" ou "assinatura". Esta última parte é vital; com uma função hash, uma ligeira diferença na entrada produz um identificador radicalmente diferente como saída. Veremos isso em ação mais tarde.
Por enquanto, basta importar o módulo integrado hashlib:
# main.py file """ A simple Blockchain in Python """ import hashlibEste módulo inclui a maioria dos algoritmos de hash de que você precisa. Lembre-se de que usaremos a função hashlib.sha256 () .
Agora, vamos entrar no GeekCoinBlock, nosso nome de blockchain totalmente original.
class GeekCoinBlock: def __init__(self, previous_block_hash, transaction_list): self.previous_block_hash = previous_block_hash self.transaction_list = transaction_list self.block_data = f"{' - '.join(transaction_list)} - {previous_block_hash}" self.block_hash = hashlib.sha256(self.block_data.encode()).hexdigest()Eu sei que isso pode resultar em um código desajeitado. Vamos analisar cada parte na próxima seção.
Explicação de GeekCoinBlock
Primeiro, criamos uma classe chamada GeekCoinBlock , um wrapper para objetos que terão certas características (atributos) e comportamentos (métodos).
Em seguida, definimos o método __ init__ (também denominado construtor), que é invocado cada vez que um objeto GeekCoinBlock é criado.
Este método possui três parâmetros:
- self (a instância de cada objeto)
- previous_block_hash (uma referência ao bloco anterior)
- transaction_list (uma lista de transações feitas no bloco atual).
Armazenamos o hash anterior e a lista de transações e criamos uma variável de instância block_data como uma string. Isso não acontece com criptomoedas reais, nas quais armazenamos esse tipo de dados como outro hash, mas para fins de simplicidade, armazenaremos cada bloco de dados como uma string.
Finalmente, criamos o block_hash , que outros blocos usarão para continuar a cadeia. É aqui que o hashlib é útil; em vez de criar uma função hash personalizada, podemos usar o sha256 pré-construído para fazer blocos imutáveis.
Esta função recebe strings codificadas (ou bytes) como parâmetros. É por isso que estamos usando o método block_data.encode () . Depois disso, chamamos hexdigest () para retornar os dados codificados em formato hexadecimal.
Eu sei que tudo isso pode ser opressor, então vamos brincar com hashlib em um shell Python.
In [1]: import hashlib In [2]: message = "Python is great" In [3]: h1 = hashlib.sha256(message.encode()) In [4]: h1 Out[4]: <sha256 ... object @ 0x7efcd55bfbf0> In [5]: h1.hexdigest() Out[5]: 'a40cf9cca ... 42ab97' In [6]: h2 = hashlib.sha256(b"Python is not great") In [7]: h2 Out[7]: <sha256 ... object @ 0x7efcd55bfc90> In [8]: h2.hexdigest() Out[8]: 'fefe510a6a ... 97e010c0ea34'Como você pode ver, uma ligeira mudança na entrada como “Python é ótimo” para “Python não é ótimo” pode produzir um hash totalmente diferente. Isso tem tudo a ver com a integridade do Blockchain. Se você introduzir alguma pequena mudança em um blockchain, seu hash mudará dramaticamente. Esta é a razão pela qual o ditado “Você não pode corromper um Blockchain” é verdade.
Usando nossa classe de bloco
Vamos construir uma classe Blockchain inteira mais tarde, mas por enquanto, vamos usar nossa classe Block para criar uma cadeia de blocos (Blockchain).
No mesmo arquivo, crie algumas transações feitas de strings simples armazenadas em variáveis, por exemplo:

class GeekCoinBlock: ... t1 = "Noah sends 5 GC to Mark" t2 = "Mark sends 2.3 GC to James" t3 = "James sends 4.2 GC to Alisson" t4 = "Alisson sends 1.1 GC to Noah"Claro, GC se refere a GeekCoin
Agora, construa o primeiro bloco de nosso Blockchain usando a classe GeekCoinBlock e imprima seus atributos. Leve em consideração que o parâmetro previous_hash do bloco de gênesis (primeiro bloco que precede outros blocos) será sempre alguma string ou hash arbitrário, neste caso, “primeiro bloco”.
block1 = GeekCoinBlock('firstblock', [t1, t2]) print(f"Block 1 data: {block1.block_data}") print(f"Block 1 hash: {block1.block_hash}")Então, fazemos o mesmo com o segundo bloco, mas passando o primeiro bloco hash como o argumento previous_hash .
block2 = GeekCoinBlock(block1.block_hash, [t3, t4]) print(f"Block 2 data: {block2.block_data}") print(f"Block 2 hash: {block2.block_hash}")Vamos executar e analisar a saída que obtemos desse trecho de código. Mais uma vez, digite seu terminal:
❯ python main.py Block 1 data: Noah sends 5 GC to Mark - Mark sends 2.3 GC to James - firstblock Block 1 hash: 01e4e15242a9601725f4a86ca01fbddaaec7105b442955bb0efcadbfc759806d Block 2 data: James sends 4.2 GC to Alisson - Alisson sends 1.1 GC to Noah - 01e4e15242a9601725f4a86ca01fbddaaec7105b442955bb0efcadbfc759806d Block 2 hash: 448c4306caf7f6937b0307f92f27fbea3bb73b3470363dee5026a1209dadcfa8Por enquanto, você só vê texto e alguns hashes de 64 caracteres, mas isso retoma praticamente o mecanismo de um Blockchain.
Você começa com um bloco de gênese, a base de todos os outros blocos.
Qualquer um pode validar a integridade da cadeia, e é por isso que um Blockchain é um sistema tão seguro. Por exemplo, se modificarmos ligeiramente o conteúdo de uma transação, diga:
t2 = "Mark sends 2.3 GC to James" -> t2 = "Mark sends 3.2 GC to James"Vemos uma mudança dramática no hash dos blocos.
Block 1 data: Noah sends 5 GC to Mark - Mark sends 3.2 GC to James - firstblock Block 1 hash: 7a990bf1d70230bf2dad6160496c0b3046da7a17b1281fd1d4c63d4eac58e78c Block 2 data: James sends 4.2 GC to Alisson - Alisson sends 1.1 GC to Noah - 7a990bf1d70230bf2dad6160496c0b3046da7a17b1281fd1d4c63d4eac58e78c Block 2 hash: 569b977306ce88b53e001dca7ba00c03a51c60d6df4650e7657dcd136f2da0acVocê pode ver o projeto atual neste repositório GitHub.
Codificando um Blockchain
Não é muito inteligente basear a integridade do nosso sistema em variáveis codificadas manualmente, por isso precisamos de outra abordagem.
Temos os blocos. É hora de construir uma classe que os junte em um Blockchain.
Vamos começar excluindo nossas transações anteriores e objetos de bloco e, em seguida, usando o código a seguir.
# main.py class Blockchain: def __init__(self): self.chain = [] self.generate_genesis_block() def generate_genesis_block(self): self.chain.append(GeekCoinBlock("0", ['Genesis Block'])) def create_block_from_transaction(self, transaction_list): previous_block_hash = self.last_block.block_hash self.chain.append(GeekCoinBlock(previous_block_hash, transaction_list)) def display_chain(self): for i in range(len(self.chain)): print(f"Data {i + 1}: {self.chain[i].block_data}") print(f"Hash {i + 1}: {self.chain[i].block_hash}\n") @property def last_block(self): return self.chain[-1]Este é novamente um grande pedaço de código. Vamos analisar cada parte:
- self.chain - A lista onde todos os blocos são registrados. Podemos acessar cada bloco por meio de índices de lista.
- generate_genesis_block - Acrescenta o genesis ou primeiro bloco à cadeia. O hash anterior do bloco é “0” e a lista de transações é simplesmente “Bloco de Gênesis”.
- create_block_from_transaction - Isso nos permite anexar blocos à cadeia com apenas uma lista de transações. Seria muito chato criar um bloco manualmente toda vez que quisermos registrar uma transação
- display_chain - Imprime a cadeia de blocos com um loop for
- last_block - uma propriedade que nos permite acessar o último elemento da cadeia. Nós o usamos no método create_block_from_transaction .
Vamos testar este Blockchain.
# main.py import hashlib class GeekCoinBlock: ... class Blockchain: ... t1 = "George sends 3.1 GC to Joe" t2 = "Joe sends 2.5 GC to Adam" t3 = "Adam sends 1.2 GC to Bob" t4 = "Bob sends 0.5 GC to Charlie" t5 = "Charlie sends 0.2 GC to David" t6 = "David sends 0.1 GC to Eric" myblockchain = Blockchain() myblockchain.create_block_from_transaction([t1, t2]) myblockchain.create_block_from_transaction([t3, t4]) myblockchain.create_block_from_transaction([t5, t6]) myblockchain.display_chain()Agora, execute o arquivo main.py.
Data 1: Genesis Block - 0 Hash 1: 39331a6a2ea1cf31a5014b2a7c9e8dfad82df0b0666e81ce04cf8173cc5aed3e Data 2: George sends 3.1 GC to Joe - Joe sends 2.5 GC to Adam - 39331a6a2ea1cf31a5014b2a7c9e8dfad82df0b0666e81ce04cf8173cc5aed3e Hash 2: 98cf363aecb33989aea0425a3c1287268bd86f63851bc08c0734a31db08506d5 Data 3: Adam sends 1.2 GC to Bob - Bob sends 0.5 GC to Charlie - 98cf363aecb33989aea0425a3c1287268bd86f63851bc08c0734a31db08506d5 Hash 3: 6f1cfcc3082488b97db8fdf8ed33f9ac7519be3e285a37a6fcc2f1904f373589 Data 4: Charlie sends 0.2 GC to David - David sends 0.1 GC to Eric - 6f1cfcc3082488b97db8fdf8ed33f9ac7519be3e285a37a6fcc2f1904f373589 Hash 4: 869df2f03c9860767d35b30a46233fbeea89a3000ae5019d1491e3829d1ab929Parabéns! Você acabou de criar um Blockchain simples do Python do zero.
Agora você pode fortalecer a imutabilidade do Blockchain usando getters e setters e implementar outros recursos como prova de trabalho, mineração ou qualquer outro conceito que explicamos no artigo de fundamentos do Bitcoin Mining.
Conclusão
Blockchain é a tecnologia por trás do Bitcoin, Etherium e todas as outras criptomoedas que existem. Neste artigo, você aprendeu como criar um Blockchain com Python usando algoritmos hash como sha256 , classes e objetos.
Seu desafio é criar um sistema de mineração e, por que não, implementá-lo com uma API REST usando frameworks como Django ou Flask.
Muitas pessoas estão fazendo fortunas com criptomoedas. Imagine o que você poderia fazer se criasse um por conta própria.
Continue codificando!
