Introduzindo o “blockchain” com python
Suspir0n
Posted on November 15, 2021
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.
Quando falamos de blockchain, você lembra logo de criptomoedas e tem alguns que acaba pensando ser apenas sobre Bitcoin, segundo o Felipe Pontes "Blockchain é o conceito base de toda criptomoeda, mas não é limitado a esse escopo e pode ser aplicado de diversas maneiras."
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.
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:
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:
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.
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.
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:
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.
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
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 diário de bordo #09 vamos nos despedindo por aqui. Voltaremos com mais um diário de bordo.
Este artigo foi útil para você?
Deixe um comentário abaixo.
Referências
Posted on November 15, 2021
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.