Introduzindo o “blockchain” com python
Tags: python, blockchain, programming, example
Published: 2021-11-15 17:30:24

Olá galera, estamos voltando com mais um diário de bordo, hoje o assunto é sobre “blockchain”, o  que é, como funciona e por fim um exemplo prático de como criar um “blockchain”(cadeia de blocos) simples em python.

![Ilustrando o funcionamento do blockchain](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bjhctku2m4ld7bpu9d1y.jpg)

Quando falamos de blockchain, você lembra logo de criptomoedas e tem alguns que acaba pensando ser apenas sobre Bitcoin, segundo o [Felipe Pontes](https://medium.com/@felipemfp/entendendo-como-funciona-uma-blockchain-com-python-4e5a66f09e16) "Blockchain é o conceito base de toda criptomoeda, mas não é limitado a esse escopo e pode ser aplicado de diversas maneiras."

![Ilustrando o funcionamento do blockchain de uma forma, mas descritiva](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/idphnr2mtff89ujp8sq0.jpg)

## Como funciona?

A blockchain significa cadeia de blocos, logo ela é feita de vários blocos formando uma cadeia, um bloco normalmente ele é composto por: uma data, um índice, algum dado(pode ser uma mensagem, um array de dados, etc.) e o hash do bloco anterior.

![modelo do blockchain](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nr5afpznch3cdcj74mqf.png)

Entretanto, para que o blockchain fique seguro, temos que criptografa-los, no exemplo que iremos trabalhar, vamos utilizar o sha256 da biblioteca padrão hashlib, com ele criará uma string com 64 caracteres. Por fim, podemos dizer que o blockchain será uma lista de hashes.

Para isso, como o nosso bloco é feito de hashs, eles precisam ser validos. Neste exemplo, para vemos se o mesmo é valido, vamos dizer que ele tem que começar com quatro "0", no caso, "0000xyz". Está validação é chamada de difficulty(dificuldade), quanto maior a dificuldade, mais tempo terá para encontrar o hash valido. Caso o hash não seja valido de primeira, temos que achar uma forma de mudar, consegui um hash diferente, não é mesmo?

Sabemos que o hash, ele sempre utiliza o mesmo dado, resultando no mesmo hash, para isso mudar, usamos o nonce, o mesmo nada mais é que um valor arbitrário, um número simples que será incrementado no decorrer do processo sempre que um hash não for valido.

Como você reparou, todo bloco tem o hash do bloco anterior, mas o primeiro bloco como fica? Chamamos o primeiro bloco de gêneses, pois ele é o primeiro bloco da cadeia, onde não existe o hash anterior, para isso basta criar um valor arbitrário  que irá representar o hash do bloco anterior.

## Blockchain, na prática

Sabe o que vamos precisar? Então, esses são os topicos: 

* Construir a blockchain
* Criptografar os blocos
* Checar a validade de um hash
* Recuperar hash anterior
* Adicionar um novo bloco

Neste exemplo, iremos ter dois arquivos: blockchain.py e main.py.

Vamos primeiro criando o arquivo blockchain.py nele iniciaremos implementando a class e importando as libs que iremos utilizar:

```python
from hashlib import sha256
from datetime import datetime


class Blockchain:
     pass
```

Agora você cria o construtor e nele vamos inicializar uma lista, que será a nossa cadeia de blocos e o nosso bloco gêneses:

```python
def __init__(self):
        self.blocks = []
        self.set_genesis_block()
```

Feito isso, agora iremos implementar a função "self.set_genesis_block()" onde você vai iniciar o seu bloco gênesis, nele vamos precisar: dos dados, o timestamp para ter a data e hora do momento, o hash anterior que iremos implementar um valor arbitrário, o índice(posição do bloco na cadeia) e por fim a criptografia dele.

```python
def set_genesis_block(self):
        data = 'Hello, World!'
        timestamp = datetime.utcnow().timestamp()
        prev_hash = 0
        index = 0
        self.hash_block(data, timestamp, prev_hash, index)
```

Para implementar a função "self.hash_block", vamos precisar criar uma estrutura de repetição e implementar o hash do bloco, verificando se ele já é valido antes de adicionar na cadeia de blocos.

```python
def hash_block(self, data, timestamp, prev_hash, index):
        hash = ''
        nonce = 1

        while not self.is_hash_valid(hash):
            block = f'{data}:{timestamp}:{prev_hash}:{index}:{nonce}'
            hash = sha256(block.encode()).hexdigest()
            nonce += 1

        print('[nonce]', nonce)
        self.blocks.append(hash)
```

A função "self.is_hash_valid" ela é bem simples a implementação dela:

```python
def is_hash_valid(self, hash):
        return hash.startswith('0000')
```

Contudo, visto que já criamos o bloco gênesis e a função que valida se o bloco é valido, só precisamos agora, criar mais três funções a "get_last_hash" que pega o hash do bloco anterior, o "add_new_block" que serve para adicionar um novo bloco na cadeia e por fim, o "get_all_blocks" para obter a cadeia completa.

```python
def get_last_hash(self):
        return self.blocks[-1]

def add_new_block(self, data):
        index = len(self.blocks)
        prev_hash = self.get_last_hash()
        timestamp = datetime.utcnow().timestamp()
        self.hash_block(data, timestamp, prev_hash, index)

def get_all_blocks(self):
        return self.blocks[:]
```

Para finalizamos este exemplo, precisamos criar o arquivo main.py que será o arquivo principal de execução, nele vamos importar o arquivo que acabamos de criar, e adicionar três blocos como teste e por fim mostrar a cadeia de blocos

main.py
```python
from blockchain import Blockchain


if __name__ == '__main__':
    blockchain = Blockchain()

    blockchain.add_new_block('Block First!')
    blockchain.add_new_block('Blockchain is very nice!')
    blockchain.add_new_block('Speak some languages ?')

    print(blockchain.get_all_blocks())
```

Com isso, finalizamos o artigo de hoje, com este exemplo incrível, onde aprendemos o que é blockchain, como ele funciona e como criar um exemplo simples e prático. Estou deixando o link do repositório do github sobre este exemplo na referência.

Este foi o <b>diário de bordo #09</b> vamos nos despedindo por aqui. Voltaremos com mais um diário de bordo.

<p align="center">
  <a href="#">
    <img src="https://cdn.dribbble.com/users/1889486/screenshots/5081642/thankyou_.gif" width="500">
  </a>
</p>

<b>Este artigo foi útil para você?</b> 
<b>Deixe um comentário abaixo.</b>

## Referências 

* [GitHub: Repositório do exemplo](https://github.com/Suspir0n/Blockchain)

* [Entendendo como funciona uma Blockchain com Python](https://medium.com/@felipemfp/entendendo-como-funciona-uma-blockchain-com-python-4e5a66f09e16)