Ethereum blockchain - como programar uma app descentralizada

Devo começar por dizer que programação para blockchain é um tema complexo e recente no qual não sou nem remotamente especialista. Escrevemos este artigo introdutório com o intuito de simplificar a compreensão do que é a Ethereum Blockchain para que mais pessoas possam ter uma visão geral de que ferramentas necessitam para criar aplicações na blockchain. Tendo isto em conta, vamos começar!

Revisão do que é a blockchain

Antes de avançarmos é importante destacar que Bitcoin e Blockchain são conceitos completamente distintos. Bitcoin é uma criptomoeda, tal como Ripple, Ether, Litecoin, Stellar, Steem, Cardano, entre outras tantas. Enquanto que Blockchain é a tecnologia que está por detrás do funcionamento destas moedas. Sendo assim, o que é então a Blockchain?

De forma bastante simplificada, a Blockchain é uma base de dados descentralizada de todas as transações realizadas. Este registo é imutável o que significa que uma vez criado não se pode apagar ou alterar. Esta “corrente de blocos” cresce à medida que são criados novos blocos. Por outras palavras, sempre que há uma nova transação é criado um novo bloco que depois de passar pelo processo de validação é adicionado à corrente. Eles são adicionados por ordem cronológica. Sendo a blockchain algo descentralizado, todos os nodes (cada computador conectado à rede) recebe uma cópia automaticamente.

Ethereum Blockchain

blockchain

Sendo este artigo sobre “O que saber para programar na Blockchain” seria impossível não falar do Ethereum. O que tem afinal de tão especial esta blockchain? Bem, o ingrediente secreto são os tão famosos smart contracts. O que nos leva ao 1º momento de key term definition:

Smart Contact (SC): é um programa de software que tem com o objetivo de facilitar, verificar ou fazer valer digitalmente uma negociação ou a execução de um contrato. Ou seja, é possível criar a descentralização pois deixa de ser necessário um intermediário para fazer essa validação.

A Ethereum criou a sua própria linguagem de programação chamada Solidity. É com esta linguagem que os Smart Contracts (SC) são escritos e colocados na Ethereum Network e para que possam “rodar” eles são executados na Ethereum Virtual Machine (EVM). A Ethereum blockchain pode ser considerada como a “memória” da EVM.

solidity

Um pequeno exemplo de um smart contract escrito em Solidity.

O que podem os Smart Contract fazer

Bem, sabendo nós que os SC têm um Address e um Balance, isto permite-nos enviar ETH como se fosse uma conta normal. Quando o SC recebe os ETH, ele ativa e corre o programa que possui possibilitando assim que sejam manipulados de varia formas os ETH enviados e até mesmo ativar outros SC.

Mas ainda há mais. Os SC podem expor um lista de funções. Basicamente um menu com diferentes opções. Algo que pode ser ativado mesmo sem enviar nenhum ETH.

eth

O menu de um jogo de apostas chamado Rouleth.

Casos práticos para o uso dos SC:

Contratos de financiamento: libertar ETH para um beneficiário em determinada data no futuro ou quando um conjunto de condições estiverem reunidas. Limitar gastos: possibilitar apenas o envio/gastos de ETH por dia. Algo bastante útil para quem tem problemas em se controlar em Gambling Games, compra de sapatos, ou outra situação do género.

Ethereum token

Tal como se pode ver há a possibilidade de criar uma vasta gama de SC pois eles são bastante flexíveis. Contudo, estes exemplos são apenas a ponta do Iceberg. Há um tipo de SC que realmente abre as portas para a criatividade fluir chamado Ethereum token.

O Ethereum token é um SC que simula todas as propriedades esperadas de uma moeda digital. Ou seja, há a possibilidade de ter um balance, pode ser enviado, recebido e trocado. O site BlockGeek tem um artigo muito interessante e bem detalhado sobre o tema.

Na sua essência, tokens permitem que qualquer pessoa possa criar a sua própria moeda para qualquer propósito que se queira ou se imagine. Isto claro, desde que corra na Blockchain do Ethereum. Será correto dizer que os melhores tokens são aqueles que oferecem algum benefício por mantê-los em vez de serem apenas uma moeda de troca. Ou seja, que o token em si tenha algum tipo de valor incorporado. Tal como o Ether que funciona como combustível para executar contratos inteligentes.

DAPPS - aplicações descentralizadas

ethereum-app

Apresento-vos as Dapps (Decentralized Application). E o que é isto ao certo… Bem é um conjunto de SC que juntos formam uma aplicação. Muitas vezes emparelhado com uma web page que fornece uma interface amigável e um Ethereum token que alimenta a dapp de alguma forma.

dapp-sc

Por onde começar

Levei algum tempo a conseguir compreender como é que tudo isto se junta de forma a criar algo consistente. Mas graças ao Mário Valente (ao qual agradeço imenso a paciência e tempo despendido) e à comunidade Blockchain Portugal (um grupo no facebook o qual recomendo vivamente que sigam) consegui juntar as peças todas.

Vamos começar por compreender a imagem abaixo:

dapp-architecture

Nesta imagem temos uma arquitetura geral de uma ethereum dapp. A parte mais externa, assemelha-se a uma app normal, a grande diferença está no seu interior - a sua base de dados é a blockchain e para a aceder é preciso efetuar um certo de número de validações e respeitar as regras dos smart contracts relativos a esta aplicação.

Como vemos na imagem em cima, temos um client side que contém a interface gráfica com que user interage no browser. O user efetua pedidos http de modo a pedir a informação ao servidor da nossa aplicação, pedidos esses que são geridos com express.js (ou outro), tal como seria de esperar numa app em node.js, por exemplo. Mas como é que esse servidor interage com a blockchain? Como é que são criados os smart contracts que estabelecem que informação podemos extrair da base de dados?

Para isso necessitamos de ter um olhar mais profundo, por de dentro da nossa app.

Tendo nós uma imagem geral de como tudo se encaixa podemos avançar para algo um pouco mais técnico. Algo como a imagem seguinte:

dapp-sol

Antes da nossa dapp estar pronta a ser utilizada é necessário escrever os smart contracts onde se definem as “regras do jogo”. Tudo começa ai, programar o smart contract na linguagem de programação Solidity num ficheiro pronto a ser enviado.

Depois de ter os smart contracts escritos começamos no processo que podemos observar no ponto 1. da imagem. É preciso fazer a compilação desses contractos. Pode-se escolher usar Solc ou Web3. Não há propriamente uma vantagem na utilização de uma ou de outra. Ao se escolher Solc será necessário usar-se Node.Js enquanto que se se optar por usar Web3, Node.Js é opcional. Vamos assumir que preferimos usar Web3 neste caso.

O Web3 Compiler envia a informação para o Local Ethereum Node, onde o código é convertido para bytecode que por sua vez é reenviado para a nossa Dapp.

Por fim, chegamos a ponto 2. da nossa imagem. Depois de ter um ficheiro compilado dos SC, o Web3 cria uma Application Binary Interface (ABI) e faz deploy dos nossos contratos na blockchain. A ABI é criada para que a Dapp comunique com a Blockchain do Ethereum através de Remote Procedure Calls (RPCs) o que permite fazer a ligação ao Local Ethereum Node (na imagem dão o exemplo Geth) que comunica com a ETH Network.

Solidity

Visto que para se criar um smart contract é preciso saber Solidity, devem começar por aprender essa mesma linguagem. Deixo aqui alguns recursos para que possam compreender esta linguagem. Quem souber JavaScript terá uma maior facilidade em compreender Solidity.

Nota: caso estejam a começar a aprender a programar sugiro que comecem por outra linguagem. Solidity é algo ainda recente como tal há poucos tutoriais que possam seguir. Pessoalmente sugiro que comecem por JavaScript e depois sim, passem para Solidity.

Front-End

Aqui nada muda. Pode-se usar apenas HTML, CSS e JS. Há a possibilidade de usar Angular, React. Tudo se mantém.

Web3.js

Por fim vem o Web3.js. Ele será usado para fazer validações e as ligações do Front-End com o Back-end, em síntese é o que liga tudo. De forma mais precisa Web3.js é uma coleção de bibliotecas (pacote npm para node.js) que permitem o programador interagir com um local ou remote Ethereum node usando HTTP ou IPC connection.

Aqui podem ser encontrados alguns recursos para se compreender melhor de que se trata e como usar:

Conclusão

Bem, agora que já sabes o que é necessário para começares a programar para a Blockchain é o momento para começar a criar. Sugiro que explores um pouco mais a Blockchain da Ethereum, compreendas o que é o Proof Of Work e Proof Of Stake. Como funcionam os pagamentos do poder computacional. A forma como o “Gas” é usado entre algumas outras situações.

Caso tenhas alguma dúvida ou curiosidade basta escreveres nos comentários ou então podes mesmo entrar em contacto connosco por social media ou email. Até breve.

Fontes:
1) ethereum.org
2) coindesk.com
3) ethereum.org

Um especial agradecimento ao Mário Valente e ao grupo Blockchain Portugal por todo o apoio e informação durante o processo de escrita.