O Hyperledger Fabric é um framework criado pela IBM e mantido pela Linux Foundation, contando com diversos outros parceiros.
Focado em facilitar a criação de redes blockchain para negócios, vêm crescendo de maneira exponencial, resultando em uma ferramenta robusta e versátil.
No último post, mostrei o que é o blockchain e como usar o Hyperledger Composer Playground. Hoje, vou mostrar como instalar e configurar o Fabric, vamos lá?
TL;DR - Too Long, Didn't Read
Em resumo, vamos seguir o tutorial encontrado na documentação do Fabric em si, mostrando como configurar a ferramenta no Windows 10 (através do WSL) e Linux (Ubuntu - Debian).
Antes de começar
É importante lembrar que no dia da publicação deste conteúdo, a última versão do Fabric é release-v1.4, e é essa versão que vou utilizar para construir esse guia.
Esse tutorial é focado em instalação de uma ferramenta para criação de redes de negócio em blockchain, o que não é muito simples para quem não é acostumado a trabalhar com linha de comando e um pouco de programação.
Recomendo que você esteja confortável em utilizar comandos UNIX principalmente, mesmo que esteja usando Windows 10 como eu.
No Windows, vou mostrar como instalar usando WSL (Windows Subsystem for Linux), pois para rodar o Hyperledger Composer futuramente, é necessário porém, não precisa seguir por esse caminho para o Fabric. Na documentação do Fabric você pode ver como instalar no Windows sem WSL.
Instalação dos pré-requisitos
Antes de tudo, se você está usando Windows 10, vai ter que fazer algumas coisas a mais.
Importante: vou mostrar como instalar no Windows 10 Pro ou Enterprise. A versão Home do Windows 10 não tem suporte à Hyper-V, o que altera a instalação do Docker e pode alterar como trabalhar com outros componentes.
Configurando o Windows 10
Primeiro, vamos configurar o Windows 10 para trabalhar com WSL e Docker. Você pode pular essa parte se estiver usando Linux (baseado em Debian).
Abra a janela "Windows Features" ao executar optionalfeatures (pode ser na linha de comando ou pressionando Win+R):
Na janela que abrir, você vai habilitar as opções Hyper-V e Windows Subsystem for Linux:
Com isso, o Windows vai instalar os arquivos necessários para habilitar virtualização e o uso de comandos unix nativamente. Depois de instalar e reiniciar sua máquina para finalizar, vamos instalar o Ubuntu 18 e Docker CE para Windows.
Abra a store do Windows e procure por Ubuntu:
Aqui, estou usando a versão 18.04 LTS, mas os comandos devem ser os mesmos para a versão 16.04 LTS.
Depois de instalar, execute o aplicativo Ubuntu. Será aberto um terminal para a configuração inicial, requisitando seu nome de usuário e senha. Você deve terminar com algo parecido com isso:
Com o WSL instalado e configurado em nossa máquina, vamos configurar o Docker CE para Windows, antes de continuar para os comandos Ubuntu.
Instale o Docker para Windows normalmente através do pacote .exe disponibilizado no site. Depois de instalar, você vai ver um novo ícone na sua barra de tarefas:
Abra o Docker clicando com o botão direito e abrindo Settings. Para que o Hyperledger Fabric funcione corretamente, você precisa expor o Docker Engine do Windows na porta 2375, ao habilitar a configuração.
Pode parecer estranho, mas o que vamos fazer é instalar o Docker no Windows e no Ubuntu, porém, vamos sempre usar o engine do Windows para execução dos comandos.
Já existe uma maneira diferente de fazer isso, agora que o WSL aceita executar programas nativos do Windows, porém, não consegui fazer com que o Fabric identificasse o comando docker dessa maneira (mesmo ele funcionando diretamente na linha de comando).
O Windows configura um limite para tamanho de nome de arquivos no Git. Eu me deparei com esse problema, mas não sei se foi pelo Git do Windows ou Ubuntu.
A solução é simples, apenas habilitar uma feature no próprio Git:
git config --global core.autocrlf false
git config --global core.longpaths true
Se os comandos Git não foram encontrados, instale o cmder, conforme a sessão Extra logo abaixo, ou então execute pelo WSL (Ubuntu vem com Git instalado por padrão).
A última coisa a se fazer, é configurar o caminho onde o WSL monta o disco C: (pode ser outro disco no seu caso, o importante é que seja onde você vai instalar os projetos do Fabric).
Por padrão, o WSL monta o disco C: em /mnt/c, só que o Docker assume que o caminho é apenas /c. Para resolver esse problema, vamos montar a pasta /mnt/c em /c (poderíamos fazer um link simbólico, mas o Fabric ainda não funcionaria nesse caso). Dentro do WSL, rode os seguintes comandos:
sudo mkdir /c
sudo mount --bind /mnt/c /c
Certo, isso vai funcionar durante uma sessão. Para deixar isso como permanente, vamos utilizar o Launch Settings do WSL (disponível a partir da build 17093 do Windows). No WSL, abra o arquivo
/etc/wsl.conf (pode criá-lo se não existir):
sudo nano /etc/wsl.conf
Adicione o seguinte conteúdo:
# Alterando o caminho para montar o disco C:
[automount]
enabled = true
root = /
Salve, e feche o terminal (não apenas o WSL, mas todas as instâncias de terminal) e abra novamente. O caminho que você ver na tela deverá ser algo como /c/User/...., começando com /c.
Ótimo, agora que temos nosso Windows 10 configurado, podemos começar as instalações dos pré-requisitos no Linux. A partir daqui, os comandos deverão ser executados em um terminal WSL.
Extra
Eu gosto de usar o cmder no Windows 10, por ter mais flexibilidade e um layout mais bonito. Para instalar, é só baixar do site oficial. Para executar o Ubuntu no cmder, basta digitar o comando wsl, ou então definir o WSL como padrão.
Vá em configurações (Win+Alt+P), clique no submenu Tasks dentro de Startup e adicione uma nova task ao clicar no +. Dê o nome de bash::wsl, e envie os seguintes parâmetros:
/icon "%USERPROFILE%\AppData\Local\lxss\bash.ico"
Na janela de baixo:
%windir%\system32\bash.exe ~ -cur_console:p
Se quiser definir essa tarefa como padrão, clique em Startup e selecione bash::wsl na lista de Specified named task:
Assim, você terá uma linha de comando um pouco mais bonita para trabalhar:
Aqui estou usando Oh My ZSH com o tema Powerlevel9k
Configurando o Linux (debian)
A partir daqui, mostro como configurar o Hyperledger Fabric no Linux. Lembre-se, se estiver no Windows, use o terminal WSL para rodar os comandos a seguir.
Vamos começar pelos pré-requisitos.
cURL
O cURL é utilizado para realizar conexões HTTP e no nosso caso, baixar pacotes vindos da web de maneira tranquila. wget também funciona, porém, o Fabric utiliza do cURL nos seus scripts.
Vamos instalar o cURL e testar sua utilização ao buscar o conteúdo do google.com:
sudo apt-get update
sudo apt-get install curl
curl https://www.google.com
Docker CE e Docker Compose
Para executar o Hyperledger Fabric, precisamos instalar o Docker e Docker Compose. Em ambiente de produção por exemplo, não é necessário o Docker, e o Fabric suporta qualquer tipo de virtualização, ou mesmo instalar em um servidor.
Como vamos desenvolver localmente e aprender sobre o Fabric, vamos seguir usando o Docker.
Primeiro, vamos adicionar as chaves GPG e o repositório oficial do Docker:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
Atualize a lista de pacotes:
sudo apt-get update
Para ter certeza que vamos instalar do repositório oficial, vamos verificar o cache:
apt-cache policy docker-ce
O resultado deve ser parecido com o seguinte:
docker-ce:
Installed: (none)
Candidate: 18.06.1~ce~3-0~ubuntu
Version table:
18.06.1~ce~3-0~ubuntu 500
500 https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
Aqui, você pode verificar que o docker-ce não está instalado, mas temos o candidato correto para instalação.
Agora sim, podemos instalar o docker-ce:
sudo apt-get install -y docker-ce
Para verificar se está rodando corretamente:
sudo systemctl status docker
O output deve ser o seguinte (ou parecido):
Output
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2018-10-18 20:28:23 UTC; 35s ago
Docs: https://docs.docker.com
Main PID: 13412 (dockerd)
CGroup: /system.slice/docker.service
├─13412 /usr/bin/dockerd -H fd://
└─13421 docker-containerd --config /var/run/docker/containerd/containerd.toml
Para usuários Windows (WSL)
Se você está usando Windows através de WSL, aqui você precisará configurar o Docker do Ubuntu para conectar com o Docker Daemon do Windows.
Lembra que abrimos a porta 2375 para o Docker Daemon no Windows? A única alteração que vamos fazer no Ubuntu é declarar uma nova variável de ambiente, dizendo para o docker-ce que o Daemon está rodando no Windows. Abra o seu arquivo de configuração de perfil (eu uso o ~/.profile, mas por padrão, vai ser mais fácil trabalhar com o ~/.bashrc):
nano ~/.bashrc
Ao final do arquivo, adicione a variável:
# alterando o host do docker para trabalhar com o Daemon do Windows
export DOCKER_HOST=tcp://localhost:2375
Para sair do nano, use CTRL+X e depois Y para aceitar salvar as alterações.
Go (linguagem de programação)
Para instalar Go, devemos baixar o pacote binário e extrair na pasta certa.
Baixe o pacote. Para ver a última versão disponível, abra a página de downloads do Go.
wget https://dl.google.com/go/go1.11.4.linux-amd64.tar.gz
Extraia o pacote e mova o conteúdo para a pasta /usr/local:
sudo tar -xvf go1.11.4.linux-amd64.tar.gz
sudo mv go /usr/local
Agora, precisamos configurar as variáveis de ambiente, para que os comandos Go estejam disponíveis para uso:
# raíz de instalação do Go
export GOROOT=/usr/local/go
# caminho dos projetos Go. No meu caso, /home/bruno/projects/go
export GOPATH=$HOME/projects/go
# adicionando as variáveis ao PATH
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
(coloque esses comandos dentro do seu arquivo de perfil. Pode ser ~/.bashrc ou no meu caso, ~/.profile)
Verifique a instalação:
go version
go version go1.11.4 linux/amd64
Node.js runtime e NPM - Node Package Manager
Para instalar o NodeJS, prefiro usar nvm, pois possibilita que eu instale diversas versões do NodeJS, específicas para projetos.
Para instalar o nvm no Ubuntu, use cURL para executar o script (verifique a versão que estiver instalando):
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash
Novamente, adicione as seguintes linhas ao seu arquivo de perfil (~/.profile ou ~/.bashrc por exemplo):
export NVM_DIR="${XDG_CONFIG_HOME/:-$HOME/.}nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
Depois disso, instale o NodeJS versão 8, que npm já será instalado automaticamente.
nvm install 8
Python versão 2.7
Alguns scripts do Hyperledger Fabric utilizam Python 2.7, mas o Ubuntu vem com apenas o 3.5 instalado (Python 2.7 está em desuso, com seus dias contados).
Felizmente, instalar Python 2.7 é muito fácil:
sudo apt-get install python
# pip é o gerenciador de pacotes do Python
sudo apt-get install python-pip
Instalando Hyperledger Fabric
Para instalar o Fabric, a equipe do Hyperledger disponibilizou um script para Linux que facilita a instalação (recomendo rodar o script a partir da pasta que quer instalar o seu primeiro projeto:
curl -sSL http://bit.ly/2ysbOFE | bash -s 1.4.0
Esse script faz 4 coisas:
- Baixa o repositório hyperledger/fabric-samples, se necessário
- Faz o checkout da versão apropriada
- Instala os binários e configurações do Hyperledger Fabric (de acordo com a versão)
- Baixa as imagens Docker necessárias para o Fabric
Com isso, dentro da pasta do repositório, serão criados alguns scripts que utilizaremos para rodar o Fabric:
* configtxgen
* configtxlator
* cryptogen
* discover
* idemixgen
* ordered
* peer
* fabric-ca-client
Por fim, recomendo que você adicione a pasta onde esses scripts foram baixados no PATH, para que você possa executá-los através de todo o sistema operacional (novamente no seu arquivo de perfil):
# adicionando binários do Fabric
export PATH=<CAMINHO DA PASTA RAÍZ DO PROJETO>/bin:$PATH
Por hoje, é isso mesmo! Um post bem longo, mas creio que cobri todo o processo de instalação do Hyperledger Fabric. Utilizar o Fabric é diferente, antes, precisamos entender os conceitos de blockchain, peer, orderes, organizations, etc... Vamos entrar mais nesse assunto em um futuro post!
Até a próxima devs!
------------------------------
Bruno Brito
------------------------------