Movatterモバイル変換


[0]ホーム

URL:


Skip to content
DEV Community
Log in Create account

DEV Community

Cover image for Introduzindo o “blockchain” com python
Suspir0n
Suspir0n

Posted on

     

Introduzindo o “blockchain” com python

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

Quando falamos de blockchain, você lembra logo de criptomoedas e tem alguns que acaba pensando ser apenas sobre Bitcoin, segundo oFelipe Pontes "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

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

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:

fromhashlibimportsha256fromdatetimeimportdatetimeclassBlockchain:pass
Enter fullscreen modeExit fullscreen mode

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()
Enter fullscreen modeExit fullscreen mode

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.

defset_genesis_block(self):data='Hello, World!'timestamp=datetime.utcnow().timestamp()prev_hash=0index=0self.hash_block(data,timestamp,prev_hash,index)
Enter fullscreen modeExit fullscreen mode

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.

defhash_block(self,data,timestamp,prev_hash,index):hash=''nonce=1whilenotself.is_hash_valid(hash):block=f'{data}:{timestamp}:{prev_hash}:{index}:{nonce}'hash=sha256(block.encode()).hexdigest()nonce+=1print('[nonce]',nonce)self.blocks.append(hash)
Enter fullscreen modeExit fullscreen mode

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

defis_hash_valid(self,hash):returnhash.startswith('0000')
Enter fullscreen modeExit fullscreen mode

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.

defget_last_hash(self):returnself.blocks[-1]defadd_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)defget_all_blocks(self):returnself.blocks[:]
Enter fullscreen modeExit fullscreen mode

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

fromblockchainimportBlockchainif__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())
Enter fullscreen modeExit fullscreen mode

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 odiá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

Top comments(2)

Subscribe
pic
Create template

Templates let you quickly answer FAQs or store snippets for re-use.

Dismiss
CollapseExpand
 
juliocsrangel profile image
Julo Cesar Rangel
Learning blockchain, Python and C++
  • Joined

Boa tarde, gostei muito da postagem, estou iniciando em desenvolvimento com C++ e Python para blockchain.
Estou utilizando o código de um projeto para estudar um caso real de aplicação da tecnologia blockchain.

CollapseExpand
 
suspir0n profile image
Suspir0n
Evandro Silva, 20 anos. Tecnólogo no curso Analise e Desenvolvimento de Sistemas, atualmente trabalhando como desenvolvedor Python.
  • Location
    Brasil
  • Work
    Back-end Developer
  • Joined

Boa tarde man, que daora, a tecnologia é bem interessante, se tiver alguma duvida ou querer ajudar só falar man.

Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment'spermalink.

For further actions, you may consider blocking this person and/orreporting abuse

Evandro Silva, 20 anos. Tecnólogo no curso Analise e Desenvolvimento de Sistemas, atualmente trabalhando como desenvolvedor Python.
  • Location
    Brasil
  • Work
    Back-end Developer
  • Joined

More fromSuspir0n

DEV Community

We're a place where coders share, stay up-to-date and grow their careers.

Log in Create account

[8]ページ先頭

©2009-2025 Movatter.jp