Configurando e Executando um Blockchain

Passo a passo sobre como instalar e configurar um blockchain baseado no Ethereum, usando o Geth.

Fábio José
blockchain-br
9 min readOct 7, 2018

--

Nesse artigo serão abordados os passos para instalar, configurar e executar um blockchain local para suas experimentações. Para isso será utilizado o Geth — Go Ethereum, que é uma implementação em Golang do cliente para entrar na rede blockchain do Ethereum. Com ele é possível criar uma rede local para testes e estudos.

Photo by Ashim D’Silva on Unsplash

O que é necessário?

Apesar de parecer difícil, para executar um blockchain com Geth são necessárias poucas ferramentas. Pode-se utilizar o computador pessoal, um servidor, uma máquina virtual ou até uma instância dentro de um provedor de nuvem, como AWS, Azure e Google Cloud.

O Geth está disponível para Linux, Windows e macOS.

O que é necessário:

  • Um host para instalar: Laptop, Servidor ou Instância em nuvem
  • Um editor: Atom, Sublime, Vim, Kate, Brackets, Notepad++ …
  • Geth & Tools: Linux, Windows ou macOS

Versão Geth é 1.8.16

Instalação

A instalação é muito simples, nada de configurações complexas, pré-requisitos ou bibliotecas especiais.

  • Basta extrair o conteúdo compactado em um diretório, por exemplo: mychain

Depois de extrair esse conteúdo, o diretório deverá conter os seguintes arquivos:

mychain/
├── abigen
├── bootnode
├── COPYING
├── evm
├── geth
├── puppeth
├── rlpdump
└── wnode

Aqueles importantes nesse momento são:

  • bootnode: necessário para rodar um processo utilizado na descoberta de outros nós na rede.
  • geth: roda o blockchain, entrando na rede como um nó para validar transações ou executar contratos inteligentes.
  • puppeth: utilitário para criar arquivos gênese, que são fundamentais para o bootstrapping de um blockchain Ethereum.

Configuração

A configuração do blockchain será feita na mesma máquina — host. Por essa razão é necessário preocupar-se com as portas que serão alocadas por cada processo.

No caso de máquinas distintas, não haverá conflito de portas.

  1. Dentro do diretório mychain crie três outros: node1, node2 e discovery
  2. Copiar o arquivo geth para os diretórios node1 e node2
  3. Copiar o arquivo bootnode para o diretório discovery

Após executar os passos acima, obtêm-se o seguinte resultado:

├── discovery
│ └── bootnode
├── node1
│ └── geth
└── node2
└── geth

Agora serão criados os arquivos de configuração para os nodes.

Discovery

Acesse o diretório discovery no console do seu sistema operacional e execute o comando abaixo:

# Linux
./bootnode -genkey mychain.key
# Windows
bootenode.exe -genkey mychain.key

Esse comando criará um arquivo chamado mychain.key, ele contém a chave privada do bootnode que será utilizada mais a frente, quando o blockchain for iniciado.

Nodes

Acesse os diretórios node1 e node2 no console do seu sistema operacional e execute o seguinte comando:

# Linux
./geth -datadir ./data account new
# Windows
geth.exe -datadir .\data account new

Ao executar esse comando, será necessário informar uma senha para cada conta tendo em mente que ela é importante para os próximos passos, então guarde-a em um local seguro. Também é importante guardar o Address, informado ao final da criação da conta, que também será necessário.

A saída de console, para cada um dos nodes, será similar ao exemplo abaixo.

INFO [30–02|17:29:55.167] Maximum peer count ETH=25 LES=0 total=25
Your new account is locked with a password. Please give a password. Do not forget this password.
Passphrase:
Repeat passphrase:
Address: {2f96733c082064d2f5a7b283d19563116f29e274}

Lembre-se também de anotar o valor de Address:

Crie um arquivo chamado passwd.txt em mychain. Nele guarde a senha utilizada para a criar as contas de cada node, como se trata de um ambiente para testes as senhas podem ser iguais.

Após esses passos o layout do diretório deverá ser muito similar ao exemplo abaixo. Note que agora foi criado um subdiretório chamado data/keystore, em node1 e node2, nele estão armazenadas as chaves privadas de cada conta.

├── discovery
│ ├── bootnode
│ └── mychain.key
├── node1
│ ├── data
│ │ └── keystore
│ │ └── UTC--2018-09-30T20-29-59.238297103Z--2f96733c082064d2f5a7b283d19563116f29e274
│ └── geth
└── node2
├── data
│ └── keystore
│ └── UTC--2018-09-30T20-33-54.868894168Z--fa7d99e0bba100bfceb7deffb2cf9b4e18dbd980
└── geth

Arquivo Gênese

Os arquivos gênese dão origem ao blockchain, com eles é criado o bloco número 0. Nele estão as configurações de arranque da rede, bem como as contas com algum provisionamento de saldo e quais delas podem validar transações, dependendo da configuração.

Execute os comandos abaixo para criar apenas um arquivo gênese, que será utilizado por todos os nodes. Acesse o diretório mychain/.

# Linux
./puppeth
# Windows
puppeth.exe

Informe o nome da rede blockchain que terá seu arquivo gênese criado.

# Passo I: Indicar o nome da rede
Please specify a network name to administer (no spaces or hyphens, please)
> mychain

Selecione a opção 2, para indicar que se deseja criar um novo arquivo gênese.

# Passo II: Selecionar a opção número 2
What would you like to do? (default = stats)
1. Show network stats
2. Configure new genesis
3. Track new remote server
4. Deploy network components
> 2

Nesse exemplo foi criada uma rede blockchain com o algoritmo de consenso chamado Proof-of-Authority — PoA — que consome bem menos recursos computacionais que o Proof-of-Work — PoW — e Proof-of-Stake — PoS.

# Passo III: Definir o algoritmo de consenso
Which consensus engine to use? (default = clique)
1. Ethash — proof-of-work
2. Clique — proof-of-authority
> 2

Determine o espaço de tempo entre a produção de blocos. Nesse exemplo serão gerados novos blocos a cada 5 segundos.

# Passo IV: Definir o tempo segundos entre a geração de blocos
How many seconds should blocks take? (default = 15)
> 5

Como foi definido o algoritmo PoA para consenso no blockchain, é necessário definir ao menos uma conta com permissão para validar transações. Defina as duas contas que foram criadas, assim qualquer um dos nodes poderá criar novos blocos.

# Passo V: Definir quais contas tem permissão para selar blocos
Which accounts are allowed to seal? (mandatory at least one)
> 0x2f96733c082064d2f5a7b283d19563116f29e274
> 0xfa7d99e0bba100bfceb7deffb2cf9b4e18dbd980
> 0x

Defina quais contas receberão provisionamento de saldo. Também defina que as duas contas receberão um saldo bastante generoso.

# Passo VI: Definir quais contas receberão saldo
Which accounts should be pre-funded? (advisable at least one)
> 0x2f96733c082064d2f5a7b283d19563116f29e274
> 0xfa7d99e0bba100bfceb7deffb2cf9b4e18dbd980
> 0x

Utilize os endereços gerados em sua máquina local. Caso você utilize o valores dos exemplos acima, seu blockchain não funcionará!

Determine um identificador — ID — para a rede. Pense nesse ID como se fosse o RG do seu blockchain, guarde-o para uso mais afrente.

# Passo VII: Definir o ID da rede
Specify your chain/network ID if you want an explicit one (default = random)
> 1983

Selecione a opção número 2 para habilitar o menu que possibilitará a exportação das confirmações no formato JSON.

# Passo VIII: Selecionar a opção 2
What would you like to do? (default = stats)
1. Show network stats
2. Manage existing genesis
3. Track new remote server
4. Deploy network components
> 2

Exportar o arquivo gênese para formato JSON.

# Passo IX: Selecionar a opção 2, para exportar o arquivo .json
1. Modify existing fork rules
2. Export genesis configuration
3. Remove genesis configuration
> 2

Gravar o arquivo no diretório atual do console.

# Teclar enter, para criar o arquivo mychain.json
Which file to save the genesis into? (default = mychain.json)
>

Acesse o link abaixo e assista como o puppeth foi utilizado para gerar o arquivo gênese do blockchain mychain.

Note que foi criado um arquivo chamado mychain.json no diretório mychain. Copie-o para node1 e node2.

Não é necessário copiar o arquivo mychain.json para o diretório discovery.

Agora o layout do diretório mychain deve ser similar ao que segue:

├── discovery
│ ├── bootnode
│ └── mychain.key
├── node1
│ ├── data
│ │ └── keystore
│ │ └── UTC--2018-09-30T20-29-59.238297103Z--2f96733c082064d2f5a7b283d19563116f29e274
│ ├── geth
│ └── mychain.json
└── node2
├── data
│ └── keystore
│ └── UTC--2018-09-30T20-33-54.868894168Z--fa7d99e0bba100bfceb7deffb2cf9b4e18dbd980
├── geth
└── mychain.json

Metadados

Antes de executar o blockchain, é necessário realizar um processo de inicialização que criará metadados baseados no arquivo mychain.json.

Execute os comandos que seguem e cada um dos diretórios: node1 e node2.

# Linux
./geth --datadir ./data init ./mychain.json
# Windows
geth.exe --datadir .\data init .\mychain.json

Após executá-los, o layout do diretório mychain será o seguinte:

├── discovery
│ ├── bootnode
│ └── mychain.key
├── mychain.json
├── node1
│ ├── data
│ │ ├── geth
│ │ │ ├── chaindata
│ │ │ │ ├── 000001.log
│ │ │ │ ├── CURRENT
│ │ │ │ ├── LOCK
│ │ │ │ ├── LOG
│ │ │ │ └── MANIFEST-000000
│ │ │ └── lightchaindata
│ │ │ ├── 000001.log
│ │ │ ├── CURRENT
│ │ │ ├── LOCK
│ │ │ ├── LOG
│ │ │ └── MANIFEST-000000
│ │ └── keystore
│ │ └── UTC--2018-09-30T20-29-59.238297103Z--2f96733c082064d2f5a7b283d19563116f29e274
│ ├── geth
│ └── mychain.json
└── node2
├── data
│ ├── geth
│ │ ├── chaindata
│ │ │ ├── 000001.log
│ │ │ ├── CURRENT
│ │ │ ├── LOCK
│ │ │ ├── LOG
│ │ │ └── MANIFEST-000000
│ │ └── lightchaindata
│ │ ├── 000001.log
│ │ ├── CURRENT
│ │ ├── LOCK
│ │ ├── LOG
│ │ └── MANIFEST-000000
│ └── keystore
│ └── UTC--2018-09-30T20-33-54.868894168Z--fa7d99e0bba100bfceb7deffb2cf9b4e18dbd980
├── geth
└── mychain.json

Pronto, o blockchain está pronto para ser executado.

Executar o Blockchain

Nesse ponto, tudo que é necessário foi feito: instalação, configuração e inicialização.

Bootnode

O bootnode atua como um serviço de descoberta, essencial para o nodes se encontrarem e iniciarem o broadcasting dos dados produzidos.

Abra um console no diretório mychain/discovery e digite o comando que iniciará o processo de descoberta.

# Linux
./bootnode --nodekey=./mychain.key --addr :30310 --verbosity 9
# Windows
bootnode.exe --nodekey=.\mychain.key --addr :30310 --verbosity 9

Note no destaque a porta 30310. É nela em que processo bootnode estará disponível. Anote esse número!

Um das saídas do processo bootnode é a sua chave pública, que será necessária para os próximos passos. Guarde-a também!

Chave do bootnode destacada na saída do processo

Node1

Abra um novo console e acesse o diretório mychain/node1. e execute o comando abaixo para iniciar o primeiro node do blockchain.

  • no argumento --port digite a porta onde o processo desse node irá executar, que nesse exemplo é 30100
  • no argumento --unlock digite o valor do Address produzido na configuração do node1
  • no argumento --bootnodes substitua <Chave — bootnet> pelo valor gerado ao iniciar o processo bootnode
./geth --datadir ./data \
--port 30100 \
--networkid 1983 \
--unlock '<Address - node1>' \
--password ../passwd.txt \
--bootnodes 'enode://<Chave - bootnode>@127.0.0.1:30310' \
--mine \
--syncmode 'full' \
--gasprice '1'

Node 2

Outro console deve ser aberto para iniciar o node2, que está em mychain/node2. Vale destacar que a porta, argumento --port, deve ser diferente porque ambos estão na mesma máquina.

  • no argumento --port digite o número da porta onde o processo irá executar, que nesse exemplo deve ser diferente do node1. Por exemplo: 30200
  • no argumento --unlock digite o valor do Address produzido lá na configuração do node2
  • no argumento --bootnodes substitua <Chave — bootnet> pelo valor gerado ao iniciar o processo bootnode
./geth --datadir ./data \
--port 30200 \
--networkid 1983 \
--unlock '<Address - node2>' \
--password ../passwd.txt \
--bootnodes 'enode://<Chave - bootnode>@127.0.0.1:30310' \
--mine \
--syncmode 'full' \
--gasprice '1'

Os nodes 1 e 2 estarão funcionando corretamente quando produzirem a seguinte mensagem no console:

INFO [09-30|11:34:31.750] Unlocked account

Acompanhe nesse screencast como é a execução do blockchain, note que node1 e node2 devem produzir uma mensagem no console e ela mostra que está tudo correto.

Rápido screencast que mostra a mychain em execução.

Testar

Existem diversas formas de verificar se o blockchain está funcionando, uma delas é enviar uma transação de transferência. Para isso será utilizado o comando console interativo do Geth.

Certifique-se de que node1 e node2 estão em execução, então abra um novo console, aponte para o diretório mychain/node1 e digite o comando que segue, que iniciará o console do Geth.

# Linux
./geth attach data/geth.ipc
# Windows
geth.exe attach data/geth.ipc

A saída de console deverá ser algo similar ao que segue, com exceção do coinbase e datadir que devem conter o valores relativos ao que foi configurado em sua máquina.

Welcome to the Geth JavaScript console!instance: Geth/v1.8.16-stable-477eb093/linux-amd64/go1.11
coinbase: 0x2f96733c082064d2f5a7b283d19563116f29e274
at block: 0 (Thu, 04 Oct 2018 16:41:38 -03)
datadir: /home/fabiojose/mychain/node1/data
modules: admin:1.0 clique:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
>

Para efetivamente testar o blockchain, siga esses passos para submeter uma transação de transferência de valor a conta do node2.

Todos esses comandos deverão ser digitados no geth console.

// Obter saldo da conta que está no node1
> eth.getBalance(eth.coinbase)
9.04625697166532776746648320380374280103671755200316906558262375061821325312e+74
// Enviar uma transação para o blockchain
> eth.sendTransaction({from: eth.coinbase, to: "<Address do node2>", value: web3.toWei(9999999999999, "ETHER")})

Nesse link você pode assistir as interações com o console do Geth, onde os comandos para consultar saldo, enviar a transação e verificar seu status foram executados.

Se você gostou deixe suas palmas e ajude o Blockchain BR na divulgação do conhecimento! Obrigado e até o próximo! :)

--

--