Você está na página 1de 12

16/08/2019 Construindo uma Simples Blockchain com JavaScript - Training Center - Medium

Training Center
Conectamos
Construindo uma Simples Blockchain
pessoas que querem
aprender algo com JavaScript
relacionado a
desenvolvimento de
Jorge luís Follow
software com gen…
Jan 22, 2018 · 5 min read

Follow

175

https://medium.com/trainingcenter/construindo-uma-simples-blockchain-com-javascript-173183c85632#id_token=eyJhbGciOiJSUzI1NiIsImtpZCI6IjYwZjQwNjBlNThkNzVmZDNmNzBiZWZmODhjNzk0YTc3NTMyN2FhMzEiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJuYm… 1/12
16/08/2019 Construindo uma Simples Blockchain com JavaScript - Training Center - Medium

Training Center Blockchain foi uma das grandes Buzzwords de 2017, foi um tema muito
Conectamos discutido durante o ano. Para algumas pessoas blockchain era a resposta pra
pessoas que querem
aprender algo todos os problemas…O que não é bem assim, nós que somos da área de TI
relacionado a
desenvolvimento de sabemos que não existe bala de prata na questão de resolução de
software com gen… problemas, cada problema pode ser resolvido de diversas formas, “corretas”
Follow ou não.

175 “Blockchain é uma solução esperando por


problemas para resolver”.(Gerald Nash)

Para quem não sabe, uma Blockchain é basicamente um banco de dados


descentralizado, imutável e distribuído que valida cada transação em todos
os nós da rede. Isso nos dá a capacidade de usar uma arquitetura p2p(peer
to peer). Devido a essa arquitetura os usuários podem fazer transações sem
depender de uma “server” central.

Tá mas por que a blockchain recebeu tanto destaque em 2017?


Por quê 2017 foi um ano da ascensão das criptomoedas, o bitcoin teve a sua
maior alta e também ganhou um destaque fora do nicho de TI, também
tivemos várias aplicações criadas com baseados em blockchain como a
Ethereum.

E a blockchain é uma tecnologia que foi criada para o bitcoin ser possível,
mas isso não a limita sua aplicação em apenas criptomoedas, no projeto
Ethereum, por exemplo, ela te da a possibilidade de criar contratos

https://medium.com/trainingcenter/construindo-uma-simples-blockchain-com-javascript-173183c85632#id_token=eyJhbGciOiJSUzI1NiIsImtpZCI6IjYwZjQwNjBlNThkNzVmZDNmNzBiZWZmODhjNzk0YTc3NTMyN2FhMzEiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJuYm… 2/12
16/08/2019 Construindo uma Simples Blockchain com JavaScript - Training Center - Medium
inteligentes e você pode usar esse conceito para diversas aplicações desde se
você necessita de:

Autenticidade;

Training Center Consistência dos Dados;


Conectamos
pessoas que querem Descentralização;
aprender algo
relacionado a
desenvolvimento de Ok, eu quero aprender blockchain, como eu faço?
software com gen…
Vamos construir uma!
Follow

175
“A Melhor forma de aprender algo novo é
construindo com suas próprias mãos” .(Roman
Stremedlovskyi)

Neste artigo, nós vamos implementar uma blockchain pequena e uma


conexão peer to peer usando websockets. Não vai ser a melhor blockchain
do mundo nem a mais complexa, mas vai ser uma boa base para começar
entender como funciona a Blockchain em si e alguns conceitos como: P2P,
Imutabilidade, Proof of work.

Eu vou quebrar esse artigo em duas partes, na parte 1 teremos a


implementação dos seguintes itens:

O Bloco;

A Chain;

Na parte 2 teremos a implementação do sistema de comunicação P2P com


Web Sockets.

https://medium.com/trainingcenter/construindo-uma-simples-blockchain-com-javascript-173183c85632#id_token=eyJhbGciOiJSUzI1NiIsImtpZCI6IjYwZjQwNjBlNThkNzVmZDNmNzBiZWZmODhjNzk0YTc3NTMyN2FhMzEiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJuYm… 3/12
1. O Bloco
16/08/2019 Construindo uma Simples Blockchain com JavaScript - Training Center - Medium

O Bloco é a parte mais básica de uma blockchain (obvio!), mas o que é um


bloco? Basicamente(e no nosso caso) é um objeto literal do JavaScript, no
qual, vai armazenar nossas informações que vão ser:
Training Center
Conectamos Index;
pessoas que querem
aprender algo
relacionado a
PrevHash;
desenvolvimento de
software com gen… Timestamp;

Follow Data;

Hash;

175
Onde a propriedade index como está explicito é a referência do nosso Bloco,
prevHash é o hash do nosso ultimo bloco e é uma propriedade que usaremos
para fazer a validação de blocos, timestamp é a hora que nosso bloco foi
adicionado à Chain, a propriedade data é onde iremos colocar nossos
dados, que na verdade, podem armazenar qualquer coisa seja uma
quantidade de moedas virtuais até mesmo uma certidão de nascimento.

vamos à implementação do bloco:

1 const crypto = require('crypto-js');


2 const chain = require('./chain');
3
4 module.exports.generateHash = function({index, prevHash, timestamp, data}) {
5 return crypto.SHA256(data + index + prevHash + timestamp).toString();;
6 }
7
8 module.exports.create = (data) => {
9 const lastBlock = chain.last();
10
11 const newblock = {
12 index : lastBlock.index + 1,
13 prevHash : lastBlock.hash,
14 timestamp : new Date().getTime(),
15 data : data,
16 }
https://medium.com/trainingcenter/construindo-uma-simples-blockchain-com-javascript-173183c85632#id_token=eyJhbGciOiJSUzI1NiIsImtpZCI6IjYwZjQwNjBlNThkNzVmZDNmNzBiZWZmODhjNzk0YTc3NTMyN2FhMzEiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJuYm… 4/12
16/08/2019 Construindo uma Simples Blockchain com JavaScript - Training Center - Medium
17 newblock.hash = this.generateHash(newblock);
18 return newblock;
19 }
20
21 module.exports.validateBlock = (newBlock, lastBlock = chain.last()) => {
22 let blockIsValid = false;
23
Training Center 24 if (newBlock.index == lastBlock.index+1) {
Conectamos 25 blockIsValid = true;
pessoas que querem 26 } else if (newBlock.prevHash == lastBlock.hash) {
aprender algo 27 blockIsValid = true;
relacionado a 28 } else if (newBlock.hash == this.generateHash(newBlock)) {
desenvolvimento de
29 blockIsValid = true
software com gen…
30 }
31
Follow
32 return blockIsValid;
33 }

block.js hosted with ❤ by GitHub view raw

175

A o arquivo block.js temos a estrutura básica do nosso bloco, eu


implementei a moda antiga, mas você pode implementar com class se
quiser.

Neste arquivo temos só três funções, que estão bem auto-explicativas, uma
vai gerar os hashs dos blocos, uma para criação de novos blocos, e uma para
verificar se o bloco é valido, bem simples de ler e de escrever.

2. A Chain
A chain é um pouco mais complexa, para que isto funcione direito,
precisamos implementar um singleton.

Vamos ver o código:

1 const block = require('./block');


2
3 const Chain = (function() {
4 let instance;
5
https://medium.com/trainingcenter/construindo-uma-simples-blockchain-com-javascript-173183c85632#id_token=eyJhbGciOiJSUzI1NiIsImtpZCI6IjYwZjQwNjBlNThkNzVmZDNmNzBiZWZmODhjNzk0YTc3NTMyN2FhMzEiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJuYm… 5/12
16/08/2019 6 const firstBlock = { Construindo uma Simples Blockchain com JavaScript - Training Center - Medium
7 index : 0,
8 prevHash : 0,
9 timestamp : 0,
10 data : 'Blockchain is Borning',
11 hash : block.generateHash({index : 0, prevHash : 0, timestamp : 0, data : 'Blockchain is Bo
12 };
13
Training Center
14 const chain = [firstBlock];
Conectamos
pessoas que querem 15

aprender algo 16 function validateChain(chain) {


relacionado a 17 let validChain = true;
desenvolvimento de 18 if(JSON.stringify(chain[0]) !== JSON.stringify(origin)) {
software com gen… 19 validChain = false;
20 return validChain;
Follow 21 }
22
23 const temp = [chain[0]];
24
175 25 for(let i=1; i < chain.length; i++) {
26 if (block.validateBlock(chain[i], temp[i-1])) {
27 temp.push(chain[i]);
28 } else {
29 validChain = false;
30 return validChain;
31 }
32 }
33
34 return validChain;
35
36 }
37
38 function get() {
39 return chain;
40 };
41
42 function last() {
43 return chain.slice().pop();
44 }
45
46 function update(newBlock) {
47 block.validateBlock(newBlock) ? chain.push(newBlock) : console.log('invalid block recived');
48 }
49
50 function replace(newChain) {
51 if (validateChain(newChain) && newChain.length > chain.length) {
52 chain.splice(0, chain.length);
53 chain.push(...newChain);
54 } else {
https://medium.com/trainingcenter/construindo-uma-simples-blockchain-com-javascript-173183c85632#id_token=eyJhbGciOiJSUzI1NiIsImtpZCI6IjYwZjQwNjBlNThkNzVmZDNmNzBiZWZmODhjNzk0YTc3NTMyN2FhMzEiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJuYm… 6/12
l l ('i lid h i i d')
16/08/2019 55 console.log('invalid chainuma
Construindo recived');
Simples Blockchain com JavaScript - Training Center - Medium
56 }
57 }
58
59 function create() {
60 return {get, last, update, replace}
61 }
62
Training Center
63 return {
Conectamos
64 init() {
pessoas que querem
65 if (!instance) {
aprender algo
relacionado a 66 instance = create();

desenvolvimento de 67 }
software com gen… 68
69 return instance;

Follow 70
71 }
72 };
73

175 74 })();
75
76 module.exports = Chain.init();

chain.js hosted with ❤ by GitHub view raw

Simplificando, nossa chain propriamente dita é um array com nossos


blocos, aqui implementamos algumas funções para manipulação da nossa
blockchain e uma função para validar nossa chain.

Agora, vamos dar uma olhada em cada parte do código em nosso arquivo
Chain.js :

1 const block = require('./block');


2
3 const Chain = (function() {
4 let instance;
5
6 const firstBlock = {
7 index : 0,
8 prevHash : 0,
9 timestamp : 0,
10 data : 'Blockchain is Borning',
11 hash : block.generateHash({index : 0, prevHash : 0, timestamp : 0, data : 'Blockchain is Bo
12 };
https://medium.com/trainingcenter/construindo-uma-simples-blockchain-com-javascript-173183c85632#id_token=eyJhbGciOiJSUzI1NiIsImtpZCI6IjYwZjQwNjBlNThkNzVmZDNmNzBiZWZmODhjNzk0YTc3NTMyN2FhMzEiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJuYm… 7/12
16/08/2019 13 Construindo uma Simples Blockchain com JavaScript - Training Center - Medium

14 const chain = [firstBlock];

f-part-chain.js hosted with ❤ by GitHub view raw

Training Center
Nessa primeira parte do código nós importamos o nosso arquivo bloco,
Conectamos declaramos nossa const Chain como uma função auto-executável do
pessoas que querem
aprender algo javascript, na linha 4 declaramos nossa variável instance , essa variavel vai
relacionado a fazer nosso controle do objeto e é com ela que vamos garantir que só
desenvolvimento de
software com gen… teremos uma instancia de Chain (Lembra que eu falei que precisamos de
uma singleton?).
Follow

Depois disso nós declaramos um objeto que será o genesis block da nossa
175 blockchain. (linha 6)

E finalmente na linha 14 declaramos um array que é a blockchain


propriamente dita, e já adicionamos nosso genesis block à ela.

1 function validateChain(chain) {
2 let validChain = true;
3 if(JSON.stringify(chain[0]) !== JSON.stringify(fistBlock)) {
4 validChain = false;
5 return validChain;
6 }
7
8 const temp = [chain[0]];
9
10 for(let i=1; i < chain.length; i++) {
11 if (block.validateBlock(chain[i], temp[i-1])) {
12 temp.push(chain[i]);
13 } else {
14 validChain = false;
15 return validChain;
16 }
17 }
18
19 return validChain;
20
21 }

s-part-chain.js hosted with ❤ by GitHub view raw


https://medium.com/trainingcenter/construindo-uma-simples-blockchain-com-javascript-173183c85632#id_token=eyJhbGciOiJSUzI1NiIsImtpZCI6IjYwZjQwNjBlNThkNzVmZDNmNzBiZWZmODhjNzk0YTc3NTMyN2FhMzEiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJuYm… 8/12
16/08/2019 Construindo uma Simples Blockchain com JavaScript - Training Center - Medium
Nessa segunda parte do arquivo Chain.js temos a maior função do nosso
objeto, essa função é bastante importante para consistência de dados da
nossa blockchain.

Nessa função nós primeiro verificamos que o genesis block da chain que
Training Center
Conectamos recebemos é igual ao objeto que declaramos na primeira parte do arquivo.
pessoas que querem Se ele for diferente a gente retorna a chain inválida.
aprender algo
relacionado a
desenvolvimento de
software com gen…
Se o genesis block for válido a gente passar para o nosso loop que verifica
cada bloco da chain que a gente recebeu e compara com a chain que temos
Follow
na memoria se os blocos passarem no teste a gente retorna a variável
validChain como true , se algum bloco falhar na verificação a gente retorna
false.
175

1 function get() {
2 return chain;
3 };
4
5 function last() {
6 return chain.slice().pop();
7 }
8
9 function update(newBlock) {
10 block.validateBlock(newBlock) ? chain.push(newBlock) : console.log('invalid block recived');
11 }

t-part-chain.js hosted with ❤ by GitHub view raw

Essas são as funções mais simples do nosso arquivo, basicamente são dois
getters e um setter .
Na função get() nós retornamos nosso array com a chain que está na
memoria, a função last() é auto explicativa e a função update verifica se o
bloco que ele recebeu da rede é valido, se for ele atualiza a chain da
memoria, se não ele cospe aquele console.log() com uma mensagem de
error (eu sei, eu sei, tem maneiras melhores de tratar ou jogar errors, mas
para o nosso exemplo esse basta :D).
https://medium.com/trainingcenter/construindo-uma-simples-blockchain-com-javascript-173183c85632#id_token=eyJhbGciOiJSUzI1NiIsImtpZCI6IjYwZjQwNjBlNThkNzVmZDNmNzBiZWZmODhjNzk0YTc3NTMyN2FhMzEiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJuYm… 9/12
16/08/2019 Construindo uma Simples Blockchain com JavaScript - Training Center - Medium
1 function replace(newChain) {
2 if (validateChain(newChain) && newChain.length > chain.length) {
3 chain.splice(0, chain.length);
4 chain.push(...newChain);
5 } else {
6 console.log('invalid chain recived');
7 }

Training Center 8 }

Conectamos 9
pessoas que querem 10 function create() {
aprender algo 11 return {get, last, update, replace}
relacionado a 12 }
desenvolvimento de
fhrt-part-chain.js hosted with ❤ by GitHub view raw
software com gen…

Follow
Estamos chegando no final do nosso arquivo Chain.js essas são as duas
ultima funções do nosso objeto, na função replace() é usado para substituir
175 nossa chain por outra que a gente receber da rede, nessa função nós usamos
a função validateChain() que definimos no começo do arquivo (segunda
parte) para verificar se o array que recebemos é valido e se ele é maior que a
o array que temos em memória.

Nossa ultima função create() é a função que retorna um objeto com as


funções.

1 return {
2 init() {
3 if (!instance) {
4 instance = create();
5 }
6
7 return instance;
8
9 }
10 };
11
12 })();
13
14 module.exports = Chain.init();

last-parte-chain.js hosted with ❤ by GitHub view raw

https://medium.com/trainingcenter/construindo-uma-simples-blockchain-com-javascript-173183c85632#id_token=eyJhbGciOiJSUzI1NiIsImtpZCI6IjYwZjQwNjBlNThkNzVmZDNmNzBiZWZmODhjNzk0YTc3NTMyN2FhMzEiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJuY… 10/12
16/08/2019 Construindo uma Simples Blockchain com JavaScript - Training Center - Medium
Essa é a ultima parte do nosso arquivo(e da nossa função), que retorna a
função init() que é responsável por verificar se existe uma instancia do
nosso objeto Chain, se existir nós exportamos a nossa instancia, se não
existir, nós criamos a instancia e depois exportamos ela.

Training Center . . .
Conectamos
pessoas que querem
aprender algo
relacionado a Vou parar esse artigo por aqui com nossa base da blockchain implementada,
desenvolvimento de
software com gen… no próximo vou mostrar como vai ser implementado a nossa conexão P2P
usando o modulo webSocket do node.
Follow

Abaixo vou deixar algumas referencias, e se você manja mais que eu e vê


175 que falei alguma coisa errada, comenta que eu ajusto, vamos criar uma
comunidade com um ótimo conteúdo, se você gostou deixa um clap.

Obrigado por ter lido e até a proxima!

Referencias:
Introduction to Blockchain;

Learn Blockchain by building one;

Awesome Blockchain;

Thanks to Lucas Santos.

Blockchain JavaScript Simple Blockchain Building Creating A Blockchain

Discover Medium Make Medium yours Become a member


Welcome to a place where words matter. On Follow all the topics you care about, and we’ll Get unlimited access to the best stories on Medium
Medium, smart voices and original ideas take center deliver the best stories for you to your homepage — and support writers while you’re at it. Just
stage - with no ads in sight. Watch and inbox. Explore $5/month. Upgrade

https://medium.com/trainingcenter/construindo-uma-simples-blockchain-com-javascript-173183c85632#id_token=eyJhbGciOiJSUzI1NiIsImtpZCI6IjYwZjQwNjBlNThkNzVmZDNmNzBiZWZmODhjNzk0YTc3NTMyN2FhMzEiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJuY… 11/12
16/08/2019 Construindo uma Simples Blockchain com JavaScript - Training Center - Medium
About Help Legal

Training Center
Conectamos
pessoas que querem
aprender algo
relacionado a
desenvolvimento de
software com gen…

Follow

175

https://medium.com/trainingcenter/construindo-uma-simples-blockchain-com-javascript-173183c85632#id_token=eyJhbGciOiJSUzI1NiIsImtpZCI6IjYwZjQwNjBlNThkNzVmZDNmNzBiZWZmODhjNzk0YTc3NTMyN2FhMzEiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJuY… 12/12