Esta atividade tem como objetivo implementar uma API de acesso ao nosso blockchain. Isso permitirá a interação entre múltiplos nós que implementem nosso protocolo. Outro objetivo desta atividade é definir o modelo de consenso.
Essa atividade encerra o projeto de desenvolvimento de nosso blockchain privado. A entrega será realizada no Google Classroom mas a avaliação será feita no formato de apresentação online ao professor, no dia 25/03/2021, das 17:00 as 18:30. O trabalho deve ser desenvolvido individualmente ou em dupla. Plágios não serão tolerados, resultando em nota zero para todos os envolvidos.
Submissão deve ser feita a partir do GitHub Classroom até às 23:59 do dia 25/03/2021 (mesmo dia da apresentação). Basta realizar o commit do seu arquivo blockchain.py
no repositório privado criado para você a partir do link disponibilizado. Qualquer dúvida nesta etapa consulte o professor no Discord. Não esqueça de editar o arquivo README.md para conter o seu nome completo.
Baixe o arquivo ./blockchain.py
para obter o boilerplate para esta atividade. Caso seja necessário, utilize o gerenciador de pacotes pip para instalar os módulos necessários. Todos os boilerplates são compatíveis com o Python 3+.
Sua API precisará implementar 5 end-points:
- [POST]
/transactions/create
para criar uma nova transação a ser incluída no próximo bloco. No corpo da requisicão HTTP, usando POST, inclua as informações necessárias para criação de uma nova transação. - [GET]
/transactions/mempool
para retornar a memory pool do nó. - [GET]
/mine
para informar o nó para criar e minerar um novo bloco. Ou seja, um nó que for requisitado a partir desse end-point deve pegar todas as transações incluídas em seu memory pool, montar um bloco e minera-lo. - [GET]
/chain
para retornar o blockchain completo daquele nó. - [POST]
/nodes/register
para aceitar uma lista de novos nós no formato de URLs. Note que já existe uma variável do tipo conjunto (set) chamadonodes
para armazenar os nós registrados. - [GET]
/nodes/resolve
para executar o modelo de consenso, resolvendo conflitos e garantindo que contém a cadeia de blocos correta. Basicamente o que deve ser feito pelo nó é solicitar a todos os seus nós registrados os seus respectivos blockchains. Então deve-se conferir se o blockchain é válido, e, se for maior (mais longo) que o atual, deve substitui-lo.
Para auxiliar no desenvolvimento do consenso, implemente os métodos isValidChain()
e resolveConflicts()
. As assinaturas e a descrição já estão no código exemplo.
Utilize qualquer framework que desejar para implementar a API. Uma sugestão é o framework Flask, bastante leve e de fácil utilização. Instale usando o pip
. Veja como é simples criar um end-point:
from flask import Flask
app = Flask(__name__)
@app.route('/hello', methods=['GET'])
def hello():
return "Hello World!"
if __name__ == '__main__':
app.run(port=5000)
Se eu executar esse código, temos um serviço web em execução. Caso entre em http://127.0.0.1:5000/hello
, o método hello()
será executado!
Caso precise fazer requisições HTTP no Python, você pode utilizar o módulo requests
. Também é bem simples, por exemplo, para requisitar o blockchain completo do nó 127.0.0.1:5001
:
import requests
response = requests.get('http://127.0.0.1:5001/chain')
obj = response.json()
Para testar, será necessário executar no mínimo dois nós simultaneamente, e no caso de ser na mesma máquina, as instâncias em execução devem usar portas diferentes (por exemplo, porta 5000 e 5001).