Sign inSign up

bacen/ethereum

By bacen

Updated about 10 years ago

Ethereum playground

Image
0

5.6K

bacen/ethereum repository overview

Ethereum playground

Este é um container derivado do "ethereum/go-client" ligeiramente modificado para simplificar a vida de quem quer criar uma rede Ethereum privada.

Esta imagem está no Dokcer Hub com o nome "bacen/ethereum".

Neste projeto há scripts que facilitam a vida do usuário.

Definindo sua rede

O que "isola" a sua rede Ethereum privada da rede pública não precisa ser necessariamente um isolamente de rede real - seus nós podem estar disponíveis na Internet e mesmo assim funcionarão como uma rede Ethereum privada.

Esta imagem permite que o usuário use variáveis de ambiente para definir os valores que isolam a sua rede das demais. Os scripts deste projeto detectam estas variáveis e executam os containers com as definições corretas.

As variáveis são:

  • GEN_NONCE: qualquer valor acordado, o default é "0x0000000000000099"
  • NET_ID: qualquer valor inteiro acordado, o default é 1972

A variável GEN_NONCE é usada para gerar o arquivo "genesis.json" que define a inicialização do blockchain. Todos os nós integrantes da rede deverão ter o mesmo valor para GEN_NONCE.

Analogamente, o NET_ID define o "networkid" da rede privada. Todos os nós integrantes da rede deverão ter o mesmo valor para NET_ID.

Bootnode

Para que os nós da rede privada encontram-se na rede há varias estratégias possíveis (entre elas a definição de nós estáticos). A opção que gera menos entraves para o desenvolvimento e crescimento da rede é o uso de um bootnode.

O bootnode é um nó simples que serve apenas como um "hub" para que a auto-descoberta dos nós seja mais rápida. Via de regra, qualquer nó Ethereum pode servir como bootnode para os demais, mas um bootnode "puro" é um nó "burro" que não participa das operações da rede. A própria rede Ethereum pública trabalha com um conjunto de bootnodes cujo endereço está hard-coded no cliente "geth".

O script bootnode.sh executa um container com o nome "ethereum-bootnode". É possível consultar o id gerado dinamicamente para o bootnode na primeira execução, consultando o log do container:

docker logs ethereum-bootnode
...
I0908 14:46:45.899423 p2p/discover/udp.go:217] Listening, enode://52f4bf370b6f407a6b3bca149b2fe24fc54ce6ac19ffe0926ad41d9bfc86ccf9bd8703fa5a4961ab28bba2a81eacba183652f744d3ff02602ecb63b7ccd3643f@172.17.0.4:30301

Há um script utilitário para obter a URL "enode" a partir deste log (este script é usado internamente em outros scripts para detectar dinamicamente o bootnode):

./getbootnodeurl.sh
enode://76e50d0dd4ae583d2653d414f9acd1df4e7a75f4bab53c7cafedc6433696ba9596c6dc84626423e629760b3ab2af9f97220dfee73961cb5be1a8ce1fa40a0bff@172.17.0.4:30301

Volumes

Os scripts que executam nós criam na pasta corrente subdiretórios para persistir os dados gerados. Por exemplo, o script runnode.sh <nome do node> cria o volume ".ether-". Em produção recomenda-se usar uma estratégia para volumes que garanta a portabilidade do nó.

  • bootnode.sh: volume ".bootnode"
  • runnode.sh: volume ".ether-" (ex: "./runnode node1" cria o volume ".ether-node1")
  • runminer.sh: volume ".ether-" (id.)

Nota: se chamados sem argumentos os script runnode.sh e runminer.sh assumem o argumento "node1" e "miner1", respectivamente).

Primeiro nó

O script runnode.sh executa o primeiro nó da rede privada (um container chamado "ethereum-node1"). É importante entender que, embora ele deva se conectar com o bootnode, não haverá nenhum "peer" na rede ainda (o bootnode não conta).

./runnode.sh

Segundo nó

O mesmo script runnode.sh pode ser usado para executar um segundo nó na rede privada, bastando informar o nome do nó como argumento, o que criará um container chamado "ethereum-<nome do nó>". É importante entender que ele conecta-se ao bootnode apenas para descobrir dinamicamente seus peers na rede.

./runnode.sh node2

Verificando os nodes (peers)

A auto-descoberta dos nodes pode demorar alguns segundos, mas verificá-la é simples com o script showpeers.sh. O comando abaixo exibe os peers do container "ethereum-node":

./showpeers.sh

Um argumento opcional informa o nome de outro container Ethereum para consultar:

./showpeers.sh ethereum-node2

Executando um miner

Os nós "ethereum-node1" e "ethereum-node2" não fazem mineração - foram usados até aqui apenas para testar a capacidade de criar uma rede que se auto-descobre. Um outro script runminer.sh foi criado para executar um minerador nesta mesma rede privada:

./runminer.sh

Você pode descobrir se ele encontrou os demais membros da rede com o comando abaixo:

./showpeers.sh ethereum-miner1

E se quiser acompanhar o seu trabalho basta verificar o log do container (a mineração pode demorar um pouco para começar):

docker logs -f ethereum-miner1

Tag summary

Content type

Image

Digest

Size

84.8 MB

Last updated

about 10 years ago

docker pull bacen/ethereum