Este documento apresenta uma introdução aos conceitos e aplicações de blockchain no contexto da Internet das Coisas (IoT). Ele discute os principais desafios e considerações para uma abordagem prática de blockchain em IoT, incluindo a implementação de transações em blocos, tornando os blocos imutáveis através de hashes, ligando os blocos uns aos outros, implementando prova de trabalho e alcançando consenso entre vários nós. O documento também fornece demonstrações de código para ilustrar esses conceitos.
Blockchain em IoT - Desafios e considerações numa abordagem prática
1. Blockchain em IoT
Desafios e
considerações numa
abordagem prática
Prof. André Márcio de Lima Curvello
contato@andrecurvello.com.br
2. Sobre mim
André Márcio de Lima Curvello
▪ Engenheiro de Computação com Ênfase em
Sistemas Embarcados – USP São Carlos
▪ MBA em Gestão de TI – UNIFRAN
▪ Mestrado em Processamento de Sinais e
Instrumentação – USP São Carlos
▪ Analista de Tecnologia – Padtec S/A
▪ Professor de Graduação e Pós-Graduação
2
6. Blockchain – Por Wikipedia
▪ Uma Blockchain é uma lista de registros
continuamente crescente, que são interligados
e protegidos usando criptografia.
▪ Cada bloco tipicamente contém um pointeiro
criptográfico hash como link para o bloco
anterior, um timestamp e dados de transação.
6
8. Blockchain - Conceitos Gerais
▪ Blockchain é uma forma de armazenar dados
digitais.
▪ Os dados podem literalmente ser qualquer coisa.
▪ Para o Bitcoin, são as transações
▫ Transferências de Bitcoin de uma conta para
outra
▪ Mas podem ser arquivos – não importa.
8
9. Blockchain - Conceitos Gerais
▪ Os dados são armazenados na forma de
blocos, que são conectados entre si usando
“hashes”.
▪ Dessa forma vem o nome “blockchain”
▫ Cadeia de Blocos.
9
10. ▪ Toda a mágica está na forma como esses dados
são adicionados e armazenados na blockchain.
▪ A blockchain tem algumas características muito
interessantes:
▫ Imutabilidade da história
▫ Sistema não-hackeável
▫ Persistência dos dados
▫ Nenhum ponto de falha
10
Blockchain - O Segredo
11. ▪ Block (Bloco): A block is a unique record in the blockchain which contains
transactions, timestamp, index, hash, etc. broadly 3 types of Block –
▫ Bloco Gênesis – primeiro bloco da blockchain
▫ Bloco Corrente – ultimo bloco da blockchain
▫ Bloco Órfão – bloco válido que não é parte da blockchain
▪ Mining (Mineração): Método de criar novos blocos.
▪ Proof Of Work (Prova de Trabalho): número difícil de gerar, mas fácil de verificar.
▪ Node (Nó): Servidor que se comporta como nó na blockchain.
▪ Consensus (Consenso): algoritmo de acordo para inserção de novos blocos aos nós.
11
Blockchain - Terminologias
12. 1 – Transações em Blocos
▪ Vamos armazenar os dados na nossa blockchain em um formato
que é amplamente usado: JSON!
▪ O termo genérico “dado” (ou data) é geralmente substituído por
transações.
▪ Para manter consistência com o padrão… vamos adotar
“transação” para referenciar nossos dados postados na
aplicação.
12
13. 1 – Transações em Blocos
▪ As transações são empacotadas em blocos.
▪ Cada bloco pode conter uma ou mais transações.
▪ Os blocos contend as transações são frequentemente gerados e
adicionados à blockchain.
▪ Como há múltiplos blocos…
Cada bloco deve ter uma identificação única!
13
14. 2 – Tornando o blocos imutáveis
▪ Nós gostaríamos de detector qualquer tipo de
modificação nos dados armazenados dentro do
bloco.
▪ Em blockchain, isso é feito usando funções
hash.
14
15. 2 – Tornando o blocos imutáveis
▪ Uma função hash é uma função que recebe
dados de qualquer tamanho e produz dados de
um tamanho fixo a partir disso, o que
normalmente serve para identificar a entrada.
▪ Exemplo em Python usando a função de
hashing sha256.
15
16. 2 – Tornando o blocos imutáveis
▪ Deve ser computacionalmente fácil de
calcular.
▪ Mesmo a mudança de um único bit nos dados
deve fazer a hash mudar por completo.
▪ Não deve ser possível adivinhar a entrada pelo
hash gerado na saída.
16
17. 3 – Ligando os Blocos
▪ A blockchain deve ser uma coleção de blocos.
▪ Devemos armazenar todos os blocos numa lista em Python
(equivalente a um array).
▪ Mas isso não é o suficiente… E se alguém
intencionalmente substitui um bloco atrás na coleção?
▪ Criar um novo bloco com transações alteradas, computar o
hash, e substituir qualquer bloco mais velho não é
problema no nosso caso.
▪ Porque iremos manter a imutabilidade e a ordem dos
blocos.
17
18. 3 – Ligando os Blocos
▪ Nós precisamos de uma forma de garantir que qualquer
mudança no passado invalide a cadeira inteira.
▪ Uma forma de fazer isso é juntar os blocos pela hash.
▪ Então ligando assim, nós vamos incluir a hash do bloco
anterior no bloco corrente.
▪ Então, se o conteúdo do bloco anterior muda, a hash desse
bloco também irá mudar, levando a um desencontro com o
campo “previous_hash” do próximo bloco/bloco seguinte.
18
19. 3 – Ligando os Blocos
▪ Cada bloco está ligado ao anterior pelo campo
“previous_hash”, mas… e o primeiro de todos os
blocos?
▪ O primeiro de todos os blocos é chamado de
“genesis block” (bloco genesis).
▪ É gerado manualmente ou por uso de alguma
lógica única, em alguns casos.
19
20. 3 – Ligando os Blocos
▪ Vamos adicionar o campo
“previous_hash” à classe do nosso bloco
e vamos implementar a estrutura inicial
da nossa classe Blcokchain.
20
23. 4 – Implementando o Proof of Work (POW)
▪ Todavia, ainda há um problema…
▪ Se nós mudarmos o bloco anterior, nós podemos
recomputar as hashes de todos os blocos seguintes
de forma fácil, criando uma diferente, porém válida,
blockchain.
▪ Para prevenir isso, nós devemos tornar a tarefa de
computar a hash difícil e aleatória.
23
24. 4 – Implementando o Proof of Work (POW)
▪ Em vez de aceitar qualquer hash para o bloco, nós
adicionamos algumas restrições.
▪ Vamos adicionar uma restrição em que nossa hash
deve começar com 2 zeros.
▪ Também, nós sabemos que há não ser que
mudemos o conteúdo do bloco, a hash não irá
mudar.
24
25. 4 – Implementando o Proof of Work (POW)
▪ Então nós vamos adicionar um novo campo no nosso bloco
chamado nonce.
▪ O nonce é um número que iremos alterar até encontrarmos uma
hash que atenda à nossa restrição.
▪ O número de zeros iniciais (2, no nosso caso) decide a
dificuldade do nosso algoritmo de “Prova de Trabalho”.
▪ Você deve ter percebido que nosso algoritmo Proof of Work é
difícil de computer, mas fácil de verificar, uma vez que
encontramos o nonce.
▪ Para verificar, basta você rodar o cálculo de hash novamente. 25
26. 5 – Adicionando Blocos à cadeia
▪ Para adicionar um bloco à cadeia
▫ Primeiro temos que verificar se o Proof of
Work provido pelo bloco está correto
▫ E se o campo previous_hash do bloco a
ser adicionado aponta para a hash do
último bloco da nossa cadeia.
26
28. 6 - Mineração
▪ Na maior parte das criptomoedas, incluindo
Bitcoin, mineradores são premiados com
algumas criptomoedas como recompensa pelo
poderio computacional despendido para
computar a Proof of Work.
28
29. 7 – Tenha Interfaces
▪ Vamos criar interfaces para o nosso Nó
interagir com outros Peers assim como
também com a aplicação que iremos
construir.
▪ Iremos usar Flask para criar uma API REST
para interagir com nosso nó.
29
30. 8 – Consenso e Descentralização
▪ O código que implementamos até agora é feito para
rodar em um único computador.
▪ Mesmo que estejamos conectando blocos com
hashes, ainda não podemos confiar uma única
entidade.
▪ Nós precisamos de vários nós para manter nossa
blockchain.
▪ Então, vamos criar um endpoint para permitir a um nó
conhecer outros peers na rede. 30
31. 8 – Consenso e Descentralização
▪ Há um problema com múltiplos nós.
▪ Devido a manipulações intencionais ou razões
não-intencionais
▫ A cópia de cadeias de alguns nós podem
divergir.
▪ Precisamos concordar sobre alguma versão da
cadeia de forma a manter a integridade do
sistema como um todo.
▫ Nós precisamos alcançar o consenso. 31
32. 8 – Consenso e Descentralização
▪ Um algoritmo simples de consenso:
▫ Concordar com a maior cadeia válida,
quando as cadeias de diferentes
participantes na rede parecem divergir.
▪ A razão por trás dessa abordagem é que a maior
cadeia é uma boa estimativa da maior parte do
trabalho feito. 32
33. 8 – Consenso e Descentralização
▪ Precisamos desenvolver uma forma para que qualquer
nó anuncie à rede que minerou um bloco
▪ Assim todos podem atualizar suas cadeias de blocos
▪ E continuar a minerar outras transações.
▪ Outros nós podem simplesmente verificar a Proof of
Work e adicionar ela a suas respectivas cadeias.
33