Apresente o conceito de prova de trabalho: Explique que a prova de trabalho exige que os mineradores resolvam um quebra-cabeça computacionalmente difícil para adicionar um novo bloco. Esse quebra-cabeça envolve encontrar um valor hash que atenda a determinados critérios, como ter um número específico de zeros à esquerda.
Python 
 pythonCopy code 
 class Blockchain: 
 def __init__(self): 
 self.chain = [] 
 self.difficulty = 4 # Ajuste o nível de dificuldade conforme necessário
Este código adiciona um atributo difficulty à classe Blockchain , que representa o número de zeros iniciais necessários no hash.
Implemente o proof_of_work : Este método irá gerar um hash válido ajustando um valor nonce até que o hash atenda aos critérios de dificuldade.
Python 
 pythonCopy code 
 import hashlib 
 class Blockchain: 
 def __init__(self): 
 self.chain = [] 
 self.difficulty = 4def proof_of_work(self, block): 
 target = "0" * self.difficulty 
 nonce = 0while Verdadeiro: 
 dados = str(bloco) + str(nonce) 
 hash_value = hashlib.sha256(data.encode()).hexdigest()
         se hash_value[:self.difficulty] == alvo: 
 retorno hash_value 
 nonce += 1
Este código adiciona o proof_of_work à classe Blockchain . Ele usa uma string target com o número necessário de zeros à esquerda e ajusta o valor nonce até que um hash válido seja encontrado.
Atualize o método add_block : Modifique o método add_block para incluir prova de trabalho. Gere um hash válido para o novo bloco usando o proof_of_work .
Python 
 pythonCopy code 
 class Blockchain: 
 def __init__(self): 
 self.chain = [] 
 self.difficulty = 4defproof_of_work(self, block): 
 # Detalhes de implementaçãodef add_block(self, block): 
 previous_hash = self.chain[-1].hash() se len(self.chain) > 0 else Nenhum 
 bloco.previous_hash = hash_anterior 
 bloco.mine(self.dificuldade)
     self.chain.append(bloco)
Este código modifica o método add_block para definir o previous_hash do novo bloco, chama o método mine no bloco com o nível de dificuldade e anexa o bloco à cadeia.
Implemente o método mine na classe Block : O método mine ajustará o valor nonce do bloco até que um hash válido seja encontrado.
Python 
 pythonCopy code 
 import hashlib 
 class Bloco: 
 def __init__(self, index, timestamp, data, previous_hash, nonce = 0): 
 self.index = index 
 self.timestamp = timestamp 
 self.data = data 
 self.hash_anterior = anterior_hash 
 self.nonce = nonce 
 self.hash = self.calculate_hash()
 def calcular_hash(self): 
 dados = str(self.index) + str(self.timestamp) + str(self.dados) + str(self.hash_anterior) + str(self.nonce)
     retornar hashlib.sha256(data.encode()).hexdigest()
 def mine(self, dificuldade): 
 alvo = "0" * dificuldade 
 enquanto self.hash[:difficulty] != alvo: 
 self.nonce += 1 
 self.hash = self.calculate_hash()
Este código adiciona o método mine à classe Block . Ele ajusta o valor nonce e recalcula o hash do bloco até que o hash atenda aos critérios de dificuldade.
Crie uma nova instância de blockchain: instancie um novo objeto Blockchain e adicione alguns blocos à cadeia.
Python 
 pythonCopiar código 
 blockchain = Blockchain() 
 bloco1 = Bloco(1, datetime.now(), "Bloco 1 Dados") 
 bloco2 = Bloco(2, datetime.now(), "Bloco 2 Dados") 
 bloco3 = Bloco(3, datetime.now(), "Bloco 3 Dados")
Este código cria um novo objeto Blockchain e três blocos.
Adicione os blocos ao blockchain: Use o método add_block para adicionar os blocos à cadeia.
Python 
 pythonCopiar código 
 blockchain.add_block(block1)
blockchain.add_block(bloco2)
blockchain.add_block(bloco3)
Este código adiciona os blocos ao blockchain.
Imprima o blockchain: Exiba os blocos do blockchain e seus hashes.
Python 
 pythonCopiar código 
 para bloco em blockchain.chain:
 print(f"Bloco: {block.index}") 
 print(f"Hash: {block.hash}")
Este código itera sobre os blocos do blockchain e imprime seus valores de índice e hash.
Nesta lição, implementamos o algoritmo de consenso de prova de trabalho em nosso blockchain. Introduzimos o conceito de prova de trabalho, explicamos como ele exige que os mineradores resolvam um quebra-cabeça computacionalmente difícil e o implementamos em nosso blockchain ajustando um valor nonce até que um hash válido seja encontrado. Também testamos a implementação da prova de trabalho adicionando blocos à cadeia e exibindo o conteúdo do blockchain.