4 Prática: Instalando o Cliente Ethereum
Geth
Geth e vermos seu funcionamento, transformando a máquina em um nó da rede Ethereum.
4.1 Introdução
Como o desenvolvimento da Ethereum está em constante evolução, existem muitos componentes, clientes, e ferramentas que foram desenvolvidas e introduzidas nos últimos anos. Carteiras (wallets) e clientes de software.
Wallets são programas que podem armazenar as chaves privadas e baseado nos endereços armazenados podem calcular o saldo (balance) de ether associado a esses endereços, consultando a blockchain. O saldo pode ser utilizado para fazer o deploy de contratos inteligentes.
Clientes são softwares que acessam a rede, podendo fazer sincronizações e interagir com a rede:
Geth: É a implementação oficial do Ethereum Client na linguagem
Go. É um cliente de execuçãoEthereum, capaz de lidar com transações, implantação e execução de contratos inteligentes e traz uma máquina virtual embutida conhecida como Ethereum Virtual Machine (EVM). Ao executar o clietneGethjunto com um cliente de consenso transforma um computador em um nó da redeEthereum. A última versão está disponível em https://geth.ethereum.org/downloads/.Nethermind: É uma implementação feita em
.NETque roda em GNU/Linux, Windows e macOS. Suporta Clique, Aura, e Ethash. Com boa velocidade de sincronização e suporte para plugins externos, ele fornece acesso confiável a dados on-chain por uma interfaceJSON-RPCe monitoramento de integridade de nós com Grafana e Seq. Detalhes de Instalação em https://docs.nethermind.io/get-started/installing-nethermind.Erigon: É um fork do
Geth, que tem sido reescrito com foco em velocidade e para poupar armazenamento. O clienteErigonpode completar a sincronização em modo full archive em menos do que três dias e ocupando menos que \(2TB\) de armazenamento. Suporta várias blockchains compatíveis com EVM e testnets. Disponível em https://erigon.gitbook.io/erigonBesu:
Hyperledger Besué um cliente Ethereum projetado para ser amigável a empresas para casos de uso de rede pública e privada permissionada. Ele também pode ser executado com redes de teste como Sepolia e Görli. O Hyperledger Besu inclui vários algoritmos de consenso, incluindoProof of Stake,Proof of WorkeProof of Authority(IBFT 2.0, QBFT e Clique). Disponível em https://besu.hyperledger.org/private-networks/get-started/install.Eth: Implementação do Ethereum Client em
C++. OEthestá disponível no repositório do GitHub: https://github.com/ethereum/aleth.Parity: Esta implementação é feita usando
Ruste desenvolvida pelaParityTechnologies. Parity pode ser baixada do link: https://www.parity.io/. Note queParitytornou-se oOpenEthereum.OpenEthereum: O cliente
OpenEthereumestá descontinuado desde \(2022\).Trinity: Trinity é a implementação do protocolo Ethereum, escrito em
Python. Trinity pode ser baixada do link https://github.com/ethereum/trinity. O site oficial é https://trinity.ethereum.org. Descontinuado,githubapresenta a mensagem “This repository has been archived by the owner on Jul 1, 2021. It is now read-only.”
A Figura 4.I apresenta os percentuais de domínio dos clientes em uso, sendo sincronizados com a rede.
Diagramas atualizados podem ser vistos no ethernodes.org e no clientdiversity.org. E alguma documentação de como migrar de um clinte para outro pode ser encontrada no link.
Light clients são clientes Simple Payment Verification (SPV), fazem download somente de uma pequena parte do blockchain. Isto permite dispositivos com recursos limitados, tais como dispositivos móveis, dispositivos embarcados, tablets ou dispositivos capazes de verificar transações.
Uma cópia completa da blockchain da Ethereum não é necessária para esses SPV clients, que também podem validar transações.
A diferença entre clients e wallets é que clientes são implementações completas do protocolo Ethereum, que suportam mineração e gerenciamento de contas e funções de wallets.
Carteiras somente armazenam as chaves públicas e privadas para fornecer gerenciamento essential de contas e interagem com o blockchain para propósitos de pagamentos, transferências de fundos.
5 Prática: Instalando o Cliente Ethereum: Geth
A proposta desta prática é vermos o funcionamento do software cliente da rede Ethereum, iremos utilizar o Geth, por ser o cliente oficial. Iremos transformar a máquina em um nó da rede Ethereum.
5.1 Instalando o Geth
Nesta etapa, você instalará o cliente padrão de camada de execução (geth) e outras ferramentas. Baixe e execute o a última versão 64-bit estável do Geth installer para seu Sistema Operacional do site Geth downloads page. Ou baixe e execute o a última versão 64-bit estável do Geth and Tools para seu Sistema Operacional do site Geth downloads page. Para Linux, baixe o arquivo Geth and Tools ou escolha nas guias a versão do seu Sistema Operacional.
O geth e as outras ferramentas podem ser instaladas em sistemas derivados do Debian e Ubuntu com o pacote ethereum:
O geth pode ser instalado em sistemas derivados do Debian e Ubuntu com o pacote ethereum:
$ sudo apt-get install -y software-properties-common
$ sudo add-apt-repository -y ppa:ethereum/ethereum
$ sudo apt-get update
$ sudo apt-get install -y ethereumEm outros Sistemas como os derivados de Arch Linux:
$ sudo pacaur -Ss ethereum
$ sudo pacaur -Ss go-ethereum
extra/go-ethereum 1.14.8-1 [instalado]
Official Go implementation of the Ethereum protocol
$ pacaur -S go-ethereum
atencao: go-ethereum-1.14.8-1 está atualizado -- reinstalando
resolvendo dependencias...
procurando pacotes conflitantes...
Pacotes (1) go-ethereum-1.14.8-1
Tamanho total instalado: 249,48 MiB
Alteracao no tamanho: 0,00 MiB
:: Continuar a instalacao? [S/n]Imagens docker são mantidas no DockerHub para usuários que preferem rodar em um ambiente com container. As seguintes imagens estão disponíveis com todas as ferramentas:
ethereum/client-go:alltools-latest última versão de desenvolvimento.
ethereum/client-go:alltools-stable última versão estável.
ethereum/client-go:alltools-{version} versão estável com número de versão específica.
ethereum/client-go:alltools-release-{version} última versão estável com um família de versões específica.
Instalação via docker pode ser feita com os comandos:
$ docker pull ethereum/client-go:alltools-stable
$ docker run -it -p 30303:30303 ethereum/client-go:alltools-stableA imagem irá expor as seguintes portas:
8545 TCP, usado pela API HTTP baseada em JSON RPC
8546 TCP, usado pela API WebSocket baseada em JSON RPC
8547 TCP, usado pela API GraphQL
30303 TCP e UDP, usado pelo protocolo P2P para rodar a rede.
Nota: se você estiver executando um cliente dentro de um container docker, você deveria montar um volume de dados com um diretório de dados do cliente na pasta /root/.ethereum dentro do container para que ter certeza que os dados baixados serão preservados entre uma reinicialização e outra do container.
Na minha máquina montaria o diretório /run/media/rogerio/DADOS/ethereum no diretório virtual /root/.ethereum, as sincronizações e comandos executados na imagem docker seriam refletidos na base de dados do diretório externo.
$ docker run -it -p 30303:30303 -v /run/media/rogerio/DADOS/ethereum:/root/.ethereum -w /root/.ethereum ethereum/client-go:alltools-latestPara atualizar as ferramentas para a última versão, basta parar o container e fazer um pull da última versão:
$ docker stop ethereum/client-go:alltools-stable
$ docker pull ethereum/client-go:alltools-latest
$ docker run -it -p 30303:30303 ethereum/client-go:alltools-latestA execução da última versão seria pelo comando:
$ docker run -it -p 30303:30303 ethereum/client-go:alltools-latestInstruções para outros Sistemas Operacionais podem ser encontradas no site oficial da documentação do Ethereum, artigo Installing Geth.
Verifique se a versão mais nova já não foi instalada. O link Rayingri (v1.14.8) lista as versões.
Na minha máquina está instalada a versão 1.14.8-stable-a9523b64, você pode verificar a sua com geth --version ou geth version ou evm --version:
$ evm --version
evm version 1.14.8-stable-a9523b64
$ geth --version
geth version 1.14.8-stable-a9523b64
$ geth version
Geth
Version: 1.14.8-stable
Git Commit: a9523b6428238a762e1a1e55e46ead47630c3a23
Git Commit Date: 20240812
Architecture: amd64
Go Version: go1.22.6
Operating System: linux
GOPATH=
GOROOT=
$ 5.2 Executando o Geth
Executando o Geth diretamente ele irá sincronizar com a rede principal (mainnet) do Ethereum. Os dados serão sincronizados com o diretório do Ethereum que será criado em:
~/.ethereumno GNU/Linux~/Library/Ethereumno OS X~/AppData/Roaming/Ethereumno Windows
Nestes diretórios:
.ethereum/geth/chaindata/: blockchain da rede principal..ethereum/sepolia/geth/chaindata: blockchain da rede de testeSepolia..ethereum/keystore: Chaves das contas criadas.
[~]$ geth
INFO [10-20|21:07:12.911] Starting Geth on Ethereum mainnet...
INFO [10-20|21:07:12.912] Bumping default cache on mainnet provided=1024 updated=4096
INFO [10-20|21:07:12.914] Maximum peer count ETH=50 LES=0 total=50
INFO [10-20|21:07:12.915] Smartcard socket not found, disabling err="stat /run/pcscd/pcscd.comm: no such file or directory"
INFO [10-20|21:07:12.920] Set global gas cap cap=50,000,000
INFO [10-20|21:07:12.922] Allocated trie memory caches clean=614.00MiB dirty=1024.00MiB
INFO [10-20|21:07:12.923] Allocated cache and file handles database=/home/rag/.ethereum/geth/chaindata cache=2.00GiB handles=262,144
INFO [10-20|21:07:12.946] Opened ancient database database=/home/rag/.ethereum/geth/chaindata/ancient/chain readonly=false
INFO [10-20|21:07:12.950]
INFO [10-20|21:07:12.950] -----------------------------------------------------------------------------------
INFO [10-20|21:07:12.950] Chain ID: 1 (mainnet)
INFO [10-20|21:07:12.950] Consensus: Beacon (proof-of-stake), merged from Ethash (proof-of-work)
INFO [10-20|21:07:12.950]
INFO [10-20|21:07:12.950] Pre-Merge hard forks:
INFO [10-20|21:07:12.950] - Homestead: 1150000 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/homestead.md)
INFO [10-20|21:07:12.950] - DAO Fork: 1920000 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/dao-fork.md)
INFO [10-20|21:07:12.950] - Tangerine Whistle (EIP 150): 2463000 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/tangerine-whistle.md)
INFO [10-20|21:07:12.950] - Spurious Dragon/1 (EIP 155): 2675000 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/spurious-dragon.md)
INFO [10-20|21:07:12.950] - Spurious Dragon/2 (EIP 158): 2675000 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/spurious-dragon.md)
INFO [10-20|21:07:12.950] - Byzantium: 4370000 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/byzantium.md)
INFO [10-20|21:07:12.950] - Constantinople: 7280000 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/constantinople.md)
INFO [10-20|21:07:12.950] - Petersburg: 7280000 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/petersburg.md)
INFO [10-20|21:07:12.950] - Istanbul: 9069000 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/istanbul.md)
INFO [10-20|21:07:12.950] - Muir Glacier: 9200000 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/muir-glacier.md)
INFO [10-20|21:07:12.950] - Berlin: 12244000 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/berlin.md)
INFO [10-20|21:07:12.950] - London: 12965000 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/london.md)
INFO [10-20|21:07:12.950] - Arrow Glacier: 13773000 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/arrow-glacier.md)
INFO [10-20|21:07:12.950] - Gray Glacier: 15050000 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/gray-glacier.md)
INFO [10-20|21:07:12.950]
INFO [10-20|21:07:12.950] Merge configured:
INFO [10-20|21:07:12.950] - Hard-fork specification: https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/paris.md
INFO [10-20|21:07:12.950] - Network known to be merged: true
INFO [10-20|21:07:12.950] - Total terminal difficulty: 58750000000000000000000
INFO [10-20|21:07:12.950] - Merge netsplit block: <nil>
INFO [10-20|21:07:12.950] --------------------------------------------------------------------------------------
INFO [10-20|21:07:12.950]
INFO [10-20|21:07:12.952] Disk storage enabled for ethash caches dir=/home/rag/.ethereum/geth/ethash count=3
INFO [10-20|21:07:12.952] Disk storage enabled for ethash DAGs dir=/home/rag/.ethash count=2
INFO [10-20|21:07:12.952] Initialising Ethereum protocol network=1 dbversion=8
INFO [10-20|21:07:12.963] Loaded most recent local header number=0 hash=d4e567..cb8fa3 td=17,179,869,184 age=53y6mo3w
INFO [10-20|21:07:12.963] Loaded most recent local full block number=0 hash=d4e567..cb8fa3 td=17,179,869,184 age=53y6mo3w
INFO [10-20|21:07:12.963] Loaded most recent local fast block number=0 hash=d4e567..cb8fa3 td=17,179,869,184 age=53y6mo3w
INFO [10-20|21:07:12.964] Loaded local transaction journal transactions=0 dropped=0
INFO [10-20|21:07:12.964] Regenerated local transaction journal transactions=0 accounts=0
INFO [10-20|21:07:12.965] Chain post-merge, sync via beacon client
INFO [10-20|21:07:12.965] Gasprice oracle is ignoring threshold set threshold=2
WARN [10-20|21:07:12.965] Engine API enabled protocol=eth
INFO [10-20|21:07:12.966] Starting peer-to-peer node instance=Geth/v1.10.25-stable-69568c55/linux-amd64/go1.19.1
INFO [10-20|21:07:12.991] New local node record seq=1,665,519,113,919 id=da440578e33a2ce7 ip=127.0.0.1 udp=30303 tcp=30303
INFO [10-20|21:07:12.992] Started P2P networking self=enode://9ae8fcdad4a7243d1bd2308a159c5800ec170e588862be110152627c9ed3fa67376ef8c75 26d7a56e9bb72da729cf792c7bef86c095471995cc352f9e353acfc@127.0.0.1:30303
INFO [10-20|21:07:12.993] IPC endpoint opened url=/home/rag/.ethereum/geth.ipc
INFO [10-20|21:07:12.993] Loaded JWT secret file path=/home/rag/.ethereum/geth/jwtsecret crc32=0xdeccafe4
INFO [10-20|21:07:12.994] WebSocket enabled url=ws://127.0.0.1:8551
INFO [10-20|21:07:12.994] HTTP server started endpoint=127.0.0.1:8551 auth=true prefix= cors=localhost vhosts=localhost
INFO [10-20|21:07:16.251] New local node record seq=1,665,519,113,920 id=da440578e33a2ce7 ip=187.95.110.26 udp=2770 tcp=30303
INFO [10-20|21:07:22.992] Looking for peers peercount=0 tried=2 static=0
INFO [10-20|21:07:32.994] Looking for peers peercount=0 tried=3 static=0
INFO [10-20|21:07:43.205] Looking for peers peercount=0 tried=9 static=0
WARN [10-20|21:07:47.967] Post-merge network, but no beacon client seen. Please launch one to follow the chain!
INFO [10-20|21:07:53.281] Looking for peers peercount=0 tried=13 static=0
INFO [10-20|21:08:03.346] Looking for peers peercount=0 tried=9 static=0O que vai levar um certo tempo para fazer toda a sincronização da rede completa.
Hoje, \(21/08/2025\) o tamanho da blockchain está em \(1380.34 GB\).
5.3 Redes de Teste
Vimos as redes Ethereum disponíveis, uma lista completa pode ser encontrada em https://ethereum.org/en/developers/docs/networks/.
A evolução das Redes de Teste pode ser vista nesse artigo The Evolution of Ethereum Testnets.
| Rede | Id | Parâmetro | Descrição | Recursos |
|---|---|---|---|---|
| Mainnet | \(1\) | --mainnet |
Rede principal, rede de produção. Quando as pessoas e as bolsas discutem os preços da ETH, estão falando sobre a Mainnet ETH. |
|
| testnet | --testnet |
Há algumas versões anteriores, para acessar as redes de teste deveríamos utilizar parâmetro --testnet e fornecer o nome da rede, como --testnet rinkeby, por padrão era a rede ropsten. Nas versões mais atuais estão previstos parâmetros específicos para cada uma das redes. |
||
| ropsten | --ropsten |
Ropsten network: pré-configurada Proof-of-Work test network | ||
| rinkeby | --rinkeby |
Rinkeby network: pré-configurada Proof-of-Authority test network | ||
| goerli | \(5\) | --goerli |
Görli network: pré-configurada Proof-of-Authority test network. Goerli testnet será descontinuada e substituída pela Holesovice em 2023. Please consider migrating your applications to Sepolia. | Website GitHub Etherscan |
| kiln | \(1337802\) | --kiln |
Kiln network: pré-configurada proof-of-work to proof-of-stake test network | |
| Sepolia | \(11155111\) | --sepolia |
Sepolia network: pré-configurada proof-of-authority test network. Criado em outubro de 2021 pelo desenvolvedores do core do Ethereum e mantida desde então. Depois que a rede Ropsten atingiu uma dificuldade total de terminal (TTD) de 5000000000000000, as redes de teste Sepolia e Goerli fizeram a transição para um mecanismo de consenso proof-of-stake para imitar a rede principal Ethereum. | Website GitHub Otterscan Etherscan |
A Figura 5.I apresenta um resumo no formato de timeline das redes de testes.
5.4 Executando o Geth com uma Rede de Teste
Ao executar o geth com algum das redes de teste será criado um diretório dentro do diretório padrão ~/.ethereum/ para cada rede de teste. Por exemplo, ~/.ethereum/goerli para --goerli e ~/.ethereum/sepolia para o --sepolia.
Iremos executar o cliente com a rede Sepolia que é recomendada como testnet padrão, uma vez que Goerli será descontinuada em \(2023\), sendo substituída pela Holesovice. É recomendado migrar sua aplicação para Sepolia.
A rede Sepolia usa um conjunto validador permissionado. É uma rede nova, o que significa que seu estado e seu histórico são pequenos, o que deixa sua sincronização mais rápida e exige menos armazenamento. Características importantes para usuários que querem rapidamente montar um nó da rede e interagir com a rede diretamente.
[rogerio@ryzen-nitro execution]$ geth --sepolia --syncmode full --http --http.addr 127.0.0.1 --http.port 8559 --http.api "eth,net,web3,personal,engine,admin" --keystore ~/.ethereum/sepolia/keystore
INFO [04-16|21:27:45.640] Starting Geth on Sepolia testnet...
INFO [04-16|21:27:45.641] Maximum peer count ETH=50 LES=0 total=50
INFO [04-16|21:27:45.643] Smartcard socket not found, disabling err="stat /run/pcscd/pcscd.comm: no such file or directory"
INFO [04-16|21:27:45.646] Set global gas cap cap=50,000,000
INFO [04-16|21:27:45.649] Allocated trie memory caches clean=154.00MiB dirty=256.00MiB
INFO [04-16|21:27:45.649] Using leveldb as the backing database
INFO [04-16|21:27:45.649] Allocated cache and file handles database=/home/rogerio/.ethereum/sepolia/geth/chaindata cache=512.00MiB handles=262,144
INFO [04-16|21:27:45.660] Using LevelDB as the backing database
INFO [04-16|21:27:45.663] Opened ancient database database=/home/rogerio/.ethereum/sepolia/geth/chaindata/ancient/chain readonly=false
INFO [04-16|21:27:45.664] Disk storage enabled for ethash caches dir=/home/rogerio/.ethereum/sepolia/geth/ethash count=3
INFO [04-16|21:27:45.664] Disk storage enabled for ethash DAGs dir=/home/rogerio/.ethash count=2
INFO [04-16|21:27:45.664] Initialising Ethereum protocol network=11,155,111 dbversion=8
INFO [04-16|21:27:45.667]
INFO [04-16|21:27:45.667] ------------------------------------------------------------------------------------
INFO [04-16|21:27:45.667] Chain ID: 11155111 (sepolia)
INFO [04-16|21:27:45.667] Consensus: Beacon (proof-of-stake), merged from Ethash (proof-of-work)
INFO [04-16|21:27:45.667]
INFO [04-16|21:27:45.667] Pre-Merge hard forks (block based):
INFO [04-16|21:27:45.667] - Homestead: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/homestead.md)
INFO [04-16|21:27:45.667] - Tangerine Whistle (EIP 150): #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/tangerine-whistle.md)
INFO [04-16|21:27:45.667] - Spurious Dragon/1 (EIP 155): #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/spurious-dragon.md)
INFO [04-16|21:27:45.667] - Spurious Dragon/2 (EIP 158): #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/spurious-dragon.md)
INFO [04-16|21:27:45.667] - Byzantium: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/byzantium.md)
INFO [04-16|21:27:45.667] - Constantinople: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/constantinople.md)
INFO [04-16|21:27:45.667] - Petersburg: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/petersburg.md)
INFO [04-16|21:27:45.667] - Istanbul: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/istanbul.md)
INFO [04-16|21:27:45.667] - Muir Glacier: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/muir-glacier.md)
INFO [04-16|21:27:45.667] - Berlin: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/berlin.md)
INFO [04-16|21:27:45.667] - London: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/london.md)
INFO [04-16|21:27:45.667]
INFO [04-16|21:27:45.667] Merge configured:
INFO [04-16|21:27:45.667] - Hard-fork specification: https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/paris.md
INFO [04-16|21:27:45.667] - Network known to be merged: true
INFO [04-16|21:27:45.667] - Total terminal difficulty: 17000000000000000
INFO [04-16|21:27:45.667] - Merge netsplit block: #1735371
INFO [04-16|21:27:45.667]
INFO [04-16|21:27:45.667] Post-Merge hard forks (timestamp based):
INFO [04-16|21:27:45.667] - Shanghai: @1677557088 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet- upgrades/shanghai.md)
INFO [04-16|21:27:45.667]
INFO [04-16|21:27:45.667] ------------------------------------------------------------------------------------
INFO [04-16|21:27:45.667]
INFO [04-16|21:27:45.668] Loaded most recent local block number=0 hash=25a5cc..3e6dd9 td=131,072 age=1y6mo2w
INFO [04-16|21:27:45.668] Loaded local transaction journal transactions=0 dropped=0
INFO [04-16|21:27:45.668] Regenerated local transaction journal transactions=0 accounts=0
INFO [04-16|21:27:45.668] Chain post-merge, sync via beacon client
INFO [04-16|21:27:45.669] Gasprice oracle is ignoring threshold set threshold=2
WARN [04-16|21:27:45.669] Engine API enabled protocol=eth
INFO [04-16|21:27:45.670] Starting peer-to-peer node instance=Geth/v1.11.5-stable-a38f4108/linux-amd64/go1.20.2
INFO [04-16|21:27:45.681] New local node record seq=1,681,600,532,512 id=05b2a1f369961544 ip=127.0.0.1 udp=30303 tcp=30303
INFO [04-16|21:27:45.682] Started P2P networking self=enode://69520d55cffdc600a5a46f15c8255ad6831dbe9cb11f73b6aef0847a5e048b99043950dae de9c4a374a37c7b93e57dc1b1d936f9946e1a98cde26b3e1e53f58c@127.0.0.1:30303
INFO [04-16|21:27:45.682] IPC endpoint opened url=/home/rogerio/.ethereum/sepolia/geth.ipc
INFO [04-16|21:27:45.683] Loaded JWT secret file path=/home/rogerio/.ethereum/sepolia/geth/jwtsecret crc32=0xa99ff4fd
INFO [04-16|21:27:45.683] HTTP server started endpoint=127.0.0.1:8559 auth=false prefix= cors= vhosts=localhost
INFO [04-16|21:27:45.686] WebSocket enabled url=ws://127.0.0.1:8551
INFO [04-16|21:27:45.686] HTTP server started endpoint=127.0.0.1:8551 auth=true prefix= cors=localhost vhosts=localhost
WARN [04-16|21:27:55.489] System clock seems off by -25.06956443s, which can prevent network connectivity
WARN [04-16|21:27:55.490] Please enable network time synchronisation in system settings.
WARN [04-16|21:28:20.672] Post-merge network, but no beacon client seen. Please launch one to follow the chain! Note que está sendo gerada uma mensagem de aviso:
WARN [04-16|21:28:20.672] Post-merge network, but no beacon client seen. Please launch one to follow the chain!Pesquisando na Internet por “Post-merge network, but no beacon client seen. Please launch one to follow the chain!”, encontramos essa solução: Github:go-ethereum, issue-25791.
A documentação do Ethereum sobre Consensus Clients, mostra que geth deve ser iniciado, com conexão RPC autenticada usando um arquivo jwtsecret. Por padrão esse arquivo está em ~/.ethereum/geth/jwtsecret. Para as redes de teste o caminho terá o diretório da respectiva rede, como por exemplo ~/.ethereum/sepolia/geth/jwtsecret para a rede Sepolia.
[rogerio@ryzen-nitro execution]$ geth --sepolia --syncmode full --http --http.addr 127.0.0.1 --http.port 8559 --http.api "eth,net,web3,personal,engine,admin" --keystore ~/.ethereum/sepolia/keystore --authrpc.addr localhost --authrpc.port 8551 --authrpc.vhosts localhost --authrpc.jwtsecret ~/.ethereum/sepolia/geth/jwtsecret
INFO [04-16|21:27:45.640] Starting Geth on Sepolia testnet... - Note que estou executando na rede de testes
--sepolia, opção na minha versão dogethé diferente do livro. No livro ele diz para usar o parâmetro--testnetque por padrão usa a rede de testesRopsten, indicando--testnet sepolia. Na minha instalação não suporta mais o parâmetro--testnet, tem o--mainnete cada rede de teste disponível tem o seu parâmetro correspondente, como--sepolia.
5.5 Criando Contas na Rede
O comando geth account new cria uma nova conta na rede principal. Indicaremos que a conta é para ser criada na rede de teste --sepolia.
[rogerio@ryzen-nitro execution]$ geth --sepolia account new
INFO [04-16|21:50:49.343] Maximum peer count ETH=50 LES=0 total=50
INFO [04-16|21:50:49.344] Smartcard socket not found, disabling err="stat /run/pcscd/pcscd.comm: no such file or directory"
Your new account is locked with a password. Please give a password. Do not forget this password.
Password:
Repeat password:
Your new key was generated
Public address of the key: 0xa9e98368B44b371ceC7d205F9fE2b074b6134C95
Path of the secret key file: /home/rogerio/.ethereum/sepolia/keystore/UTC--2023-04-17T00-51-24.036052785Z--a9e9836 8b44b371cec7d205f9fe2b074b6134c95
- You can share your public address with anyone. Others need it to interact with you.
- You must NEVER share the secret key with anyone! The key controls access to your funds!
- You must BACKUP your key file! Without the key, it's impossible to access account funds!
- You must REMEMBER your password! Without the password, it's impossible to decrypt the key!A conta com a chave pública 0xa9e98368B44b371ceC7d205F9fE2b074b6134C95 foi criada. Iremos criar uma segunda conta.
[rogerio@ryzen-nitro execution]$ geth --sepolia account new
INFO [04-16|21:52:58.948] Maximum peer count ETH=50 LES=0 total=50
INFO [04-16|21:52:58.948] Smartcard socket not found, disabling err="stat /run/pcscd/pcscd.comm: no such file or directory"
Your new account is locked with a password. Please give a password. Do not forget this password.
Password:
Repeat password:
Your new key was generated
Public address of the key: 0xc061b852A26BEdeC5Bd457b88c031c46a622f4ab
Path of the secret key file: /home/rogerio/.ethereum/sepolia/keystore/UTC--2023-04-17T00-53-06.379873395Z--c061b85 2a26bedec5bd457b88c031c46a622f4ab
- You can share your public address with anyone. Others need it to interact with you.
- You must NEVER share the secret key with anyone! The key controls access to your funds!
- You must BACKUP your key file! Without the key, it's impossible to access account funds!
- You must REMEMBER your password! Without the password, it's impossible to decrypt the key!
[rogerio@ryzen-nitro execution]$ É para termos as duas contas 0xa9e98368B44b371ceC7d205F9fE2b074b6134C95 e 0xc061b852A26BEdeC5Bd457b88c031c46a622f4ab criadas com seus arquivos em .ethereum/sepolia/keystore/, com o prefixo UTC--2023-04-17T00-53-06.379873395Z--*.
5.6 Listando as Contas
As contas existentes ou que foram criadas podem ser listadas com o comando geth account list. Utilizaremos novamente o parâmetro que indica a rede de teste --sepolia.
[rogerio@ryzen-nitro execution]$ geth --sepolia account list
INFO [04-16|21:56:11.129] Maximum peer count ETH=50 LES=0 total=50
INFO [04-16|21:56:11.130] Smartcard socket not found, disabling err="stat /run/pcscd/pcscd.comm: no such file or directory"
INFO [04-16|21:56:11.130] Set global gas cap cap=50,000,000
Account #0: {a9e98368b44b371cec7d205f9fe2b074b6134c95} keystore:///home/rogerio/.ethereum/sepolia/keystore/UTC--2023-04-17T00-51-24.03605278 5Z--a9e98368b44b371cec7d205f9fe2b074b6134c95
Account #1: {c061b852a26bedec5bd457b88c031c46a622f4ab} keystore:///home/rogerio/.ethereum/sepolia/keystore/UTC--2023-04-17T00-53-06.37987339 5Z--c061b85 2a26bedec5bd457b88c031c46a622f4ab
[rogerio@ryzen-nitro execution]$A documentação do geth, bem como comandos e parâmetros podem ser acessados em https://geth.ethereum.org/docs.
Executando com opção de responder a comandos via RPC. A documentação desta parte está disponível em https://geth.ethereum.org/docs/rpc/server.
[rogerio@ryzen-nitro execution]$ geth --sepolia --syncmode full --http --http.addr 127.0.0.1 --http.port 8559 --http.api "eth,net,web3,personal,engine,admin" --keystore ~/.ethereum/sepolia/keystore --authrpc.addr localhost --authrpc.port 8551 --authrpc.vhosts localhost --authrpc.jwtsecret ~/.ethereum/sepolia/geth/jwtsecret --nodiscover --maxpeers 155.7 Clientes de Consenso
Para terminar a configuração é necessário instalar algum cliente de consenso. Existem atualmente cinco clientes de consenso que podem ser executado em conjunto com o Geth:
Lighthouse: escrito em
Rust.Nimbus: escrito em
Nim.Prysm: escrito em
Go.Teku: escrito em
Java.Lodestar: escrito em
Typescript.
Por ser escrito na linguagem Go, assim como geth, testaremos o Prysm. O Prysm é uma implementação da especificação do consenso proof-of-stake do Ethereum.
A configuração do Prism pode ser feita conforme descrito no material https://docs.prylabs.network/docs/install/install-with-script.
O material ensina a usar o Prysm para executar um nó Ethereum, portanto resolver o problema apresentado após a atualização do Merge e opcionalmente como um validador (validator).
5.8 Instalando o cliente de consenso Prysm1
Para a instalação do Prysm, crie no diretório ~/.ethereum/<rede>, duas subpastas: consensus e execution. Acesse o diretório consensus e execute o comando para baixar o cliente Prysm e transformá-lo em executável:
$ mkdir prysm && cd prysm
$ curl https://raw.githubusercontent.com/prysmaticlabs/prysm/master/prysm.sh --output prysm.sh && chmod +x prysm.sh5.9 Gerando um arquivo JWT Secret
A conexão HTTP entre seu nó beacon e seu nó de execução precisa ser autenticada usando um token
JWT. Existem diversas formas de gerar este token:- Usando um gerado on line como este. Copie e cole o valor gerado dentro do arquivo
jwt.hex. - Usando
OpenSSLpara criar o token via comando:openssl rand -hex 32 | tr -d "\n" > "jwt.hex". - Usar o que foi gerado pelo cliente de execução
geth:~/.ethereum/sepolia/geth/jwtsecret. - Usar o próprio
Prysmpara gerar ojwt.hex:
- Usando um gerado on line como este. Copie e cole o valor gerado dentro do arquivo
#\# Optional. This command is necessary only if you've previously configured USE\_PRYSM\_VERSION
USE_PRYSM_VERSION=v4.0.0
#\# Required.
./prysm.sh beacon-chain generate-auth-secretNesta opção o Prysm irá mostrar o caminho onde o arquivo jwt.hex foi gerado.
5.10 Executando um Cliente de Execução2
Nesta etapa, executaremos o cliente de camada de execução (geth), se ainda não instalou veja os passos de instalação na Seção 5.1 e o nó beacon do Prysm que se conectará ao cliente em execução.
Note que iremos adicionar o parâmetro ao comando de execução com o arquivo com o token --authrpc.jwtsecret ~/.ethereum/sepolia/geth/jwtsecret.
O comando de execução do `Geth` atualizado:
```bash
[rogerio@ryzen-nitro execution]$ geth --sepolia --syncmode full --http --http.addr 127.0.0.1 --http.port 8559 --http.api "eth,net,web3,personal,engine,admin" --keystore ~/.ethereum/sepolia/keystore --authrpc.addr localhost --authrpc.port 8551 --authrpc.vhosts localhost --authrpc.jwtsecret ~/.ethereum/sepolia/geth/jwtsecret --nodiscover --maxpeers 15
Veja as Opções de linha de comando do Geth para a definição de parâmetros.
Dependendo das opções a Sincronização pode levar um longo tempo, de horas até dias. Enquanto sincroniza, pode ir fazendo o próximo passo.
[alertblock]{Parabéns}
Você está agora executando um nó de execução na camada de execução da Ethereum.
[/alertblock]
5.11 Executando um nó beacon usando Prysm3
Altere o comando para iniciar um nó beacon que conecta no seu nó de execução local, necessário colocar o hash de uma das contas criadas. Por padrão, aqui estou utilizando a primeira conta criada, meu caso a 0xa9e98368b44b371cec7d205f9fe2b074b6134c95.
./prysm.sh beacon-chain --execution-endpoint=http://localhost:8551 --jwt-secret=~/.ethereum/geth/jwtsecret --suggested-fee-recipient=<<hash da conta principal>>Alterei o comando padrão para o conter o hash de uma das minhas contas e para o tipo de rede de teste --sepolia. A rede Sepolia precisa de um estado inicial (genesis state) de onde começar a sincronização. O arquivo pode ser baixado de https://github.com/eth-clients/merge-testnets/blob/main/sepolia/genesis.ssz e deve ser colocado no diretório sepolia/consensus/prysm.
[rogerio@ryzen-nitro prysm]$ wget https://github.com/eth-clients/merge-testnets/raw/main/sepolia/genesis.ssz -O genesis.sszEntão o comando pode ser utilizado para iniciar um nó beacon que conecta seu nó de execução local.
[rogerio@ryzen-nitro prysm]$ ./prysm.sh beacon-chain --execution-endpoint=http://localhost:8551 --sepolia --jwt-secret=~/.ethereum/sepolia/geth/jwtsecret --genesis-state=genesis.ssz --suggested-fee-recipient=0xa9e98368b44b371cec7d205f9fe2b074b6134c95[rogerio@ryzen-nitro prysm]$ ./prysm.sh beacon-chain --execution-endpoint=http://localhost:8551 --sepolia --jwt-secret=~/.ethereum/sepolia/geth/jwtsecret --genesis-state=genesis.ssz --suggested-fee-recipient=0xa9e98368b44b371cec7d205f9fe2b074b6134c95 --checkpoint-sync-url=https://sepolia.beaconstate.info --genesis-beacon-api-url=https://sepolia.beaconstate.infoNo terminal onde o cliente de execução apareceu um novo warning: "WARN [04-19|13:07:28.462] Served miner_start reqid=14 duration="233.485us" err="etherbase missing: etherbase must be explicitly specified".
5.12 Executando o Console JavaScript
O console javascript pode também ser conectado ao nó Geth usando IPC. Quando o Geth é iniciado, um arquivo geth.ipc é criado automaticamente e salvo no diretório de dados. Este arquivo ou um caminho customizado para um arquivo IPC pode ser passado para o Geth usando o parâmetro attach:
[rogerio@ryzen-nitro ~]$ geth attach /home/rogerio/.ethereum/sepolia/geth.ipc
Welcome to the Geth JavaScript console!
instance: Geth/v1.11.5-stable-a38f4108/linux-amd64/go1.20.2
at block: 0 (Sun Oct 03 2021 10:24:41 GMT-0300 (-03))
datadir: /home/rogerio/.ethereum/sepolia
modules: admin:1.0 debug:1.0 engine:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 rpc:1.0 txpool:1.0 web3:1.0
To exit, press ctrl-d or type exit
> 5.13 Verificação do Funcionamento da Rede
Para verificar o funcionamento da rede, utilize o comando net.listing:
[rogerio@ryzen-nitro ~]$ geth attach /home/rogerio/.ethereum/sepolia/geth.ipc
Welcome to the Geth JavaScript console!
instance: Geth/v1.11.5-stable-a38f4108/linux-amd64/go1.20.2
at block: 0 (Sun Oct 03 2021 10:24:41 GMT-0300 (-03))
datadir: /home/rogerio/.ethereum/sepolia
modules: admin:1.0 debug:1.0 engine:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 rpc:1.0 txpool:1.0 web3:1.0
To exit, press ctrl-d or type exit
> net.listening
true
> A mesma verificação pode ser feita via API JSON RPC no terminal do sistema:
[rogerio@ryzen-nitro ~]$ curl -X POST --insecure --header "Content-Type: application/json" --data '{"jsonrpc":"2.0", "method":"net_listening","params":[], "id":64}' --location http://localhost:8559
{"jsonrpc":"2.0","id":64,"result":true}5.14 Listando as Contas pelo Console
A lista de contas pode ser recuperada através dos comandos no console eth.accounts e por RPC {"method": "eth_accounts", "params": []}. Em versões anteriores do geth era possível utilizar personal.listAccounts, mas personal foi depreciado.
[rogerio@ryzen-nitro ~]$ geth attach /home/rogerio/.ethereum/sepolia/geth.ipc
Welcome to the Geth JavaScript console!
instance: Geth/v1.11.5-stable-a38f4108/linux-amd64/go1.20.2
at block: 0 (Sun Oct 03 2021 10:24:41 GMT-0300 (-03))
datadir: /home/rogerio/.ethereum/sepolia
modules: admin:1.0 debug:1.0 engine:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 rpc:1.0 txpool:1.0 web3:1.0
To exit, press ctrl-d or type exit
> net.listening
true
> personal.listAccounts
ReferenceError: personal is not defined
at <eval>:1:1(0)
> eth.accounts
["0xa9e98368b44b371cec7d205f9fe2b074b6134c95", "0xc061b852a26bedec5bd457b88c031c46a622f4ab"]O mesmo resultado pode ser obtido via comando curl no terminal para listar as contas usando RPC:
[rogerio@ryzen-nitro execution]$ curl -X POST --insecure --header "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[], "id":64}' --location http://localhost:8559
{"jsonrpc":"2.0","id":64,"result":["0xa9e98368b44b371cec7d205f9fe2b074b6134c95", "0xc061b852a26bedec5bd457b88c031c46a622f4ab"]}Outros comandos podem ser executados da mesma maneira via Console JavaScript ou invocação RPC através do curl. Uma lista completa de comandos da API RPCestão disponíveis em JSON-RPC API.
Como por exemplo, recuperar a versão do cliente geth:
[rogerio@ryzen-nitro execution]$ curl -X POST --insecure --header "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}' --location http://localhost:8559
{"jsonrpc":"2.0","id":67,"result":"Geth/v1.11.5-stable-a38f4108/linux-amd64/go1.20.2"}Ou a versão da Rede:
[rogerio@ryzen-nitro execution]$ curl -X POST --header "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":67}' --location http://localhost:8559
{"jsonrpc":"2.0","id":67,"result":"11155111"}O valor \(11155111\) em result indica que estamos executando sobre a rede Sepolia. Uma lista completa com os IDs das redes está disponível em https://chainlist.org. Os mais comuns são \(1\): Ethereum Mainnet, \(2\): Morden testnet (depreciado), \(3\): Ropsten testnet, \(4\): Rinkeby testnet, \(5\): Goerli testnet (será depreciada em 2023).

5.15 Teste de Transferência de Valores entre Carteiras
Podemos testar uma transferência de valores. As duas formas de se conseguir valores é minerando ou solicitando valores para Faucets da rede, como por exemplo o https://faucet.sepolia.dev/.
Os valores de cada conta/carteira pode ser verificado com o comando eth.getBalance(hash), passando como parâmetro a cadeia hash de identificação da conta ou indicando na lista de contas eth.getBalance(eth.accounts[0]).
[rogerio@ryzen-nitro ~]$ geth attach /home/rogerio/.ethereum/sepolia/geth.ipc
Welcome to the Geth JavaScript console!
instance: Geth/v1.11.5-stable-a38f4108/linux-amd64/go1.20.2
at block: 0 (Sun Oct 03 2021 10:24:41 GMT-0300 (-03))
datadir: /home/rogerio/.ethereum/sepolia
modules: admin:1.0 debug:1.0 engine:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 rpc:1.0 txpool:1.0 web3:1.0
To exit, press ctrl-d or type exit
> net.listening
true
> eth.accounts
["0xa9e98368b44b371cec7d205f9fe2b074b6134c95", "0xc061b852a26bedec5bd457b88c031c46a622f4ab"]
> eth.getBalance("0xa9e98368b44b371cec7d205f9fe2b074b6134c95")
0
> eth.getBalance("0xc061b852a26bedec5bd457b88c031c46a622f4ab")
0
> eth.getBalance("0xa9e98368b44b371cec7d205f9fe2b074b6134c95")
0Como os saldos estão zerados, vamos iniciar a mineração com o comando miner.start().
> miner.start()
Error: etherbase missing: etherbase must be explicitly specified
at web3.js:6365:9(39)
at send (web3.js:5099:62(29))
at <eval>:1:12(2)
> web3.fromWei(eth.getBalance("0xa9e98368b44b371cec7d205f9fe2b074b6134c95"), "ether")
0
> web3.fromWei(eth.getBalance("0xc061b852a26bedec5bd457b88c031c46a622f4ab"), "ether")
0
> web3.fromWei(eth.getBalance(eth.coinbase), "ether")
Error: etherbase must be explicitly specified
at web3.js:6365:9(39)
at get (web3.js:6265:66(14))
at <eval>:1:33(5)
> eth.coinbase
Error: etherbase must be explicitly specified
at web3.js:6365:9(39)
at get (web3.js:6265:66(14))
at <eval>:1:5(1)
> eth.coinbase.panic: Error: etherbase must be explicitly specified at web3.js:6365:9(39)
goroutine 82 [running]:
github.com/dop251/goja.(*baseJsFuncObject)._call(...)
github.com/dop251/goja@v0.0.0-20230122112309-96b1610dd4f7/func.go:396O erro “Error: etherbase must be explicitly specified” ocorre pois é necessário fornecer o hash da carteira também para a execução do cliente geth.
[rogerio@ryzen-nitro execution]$ geth --sepolia --syncmode full --http --http.addr 127.0.0.1 --http.port 8559 --http.api "eth,net,web3,personal,engine,admin" --keystore ~/.ethereum/sepolia/keystore --authrpc.addr localhost --authrpc.port 8551 --authrpc.vhosts localhost --authrpc.jwtsecret ~/.ethereum/sepolia/geth/jwtsecret --nodiscover --maxpeers 15 --miner.etherbase=0xa9e98368b44b371cec7d205f9fe2b074b6134c95Fornecendo a carteira como --miner.etherbase=0xa9e98368b44b371cec7d205f9fe2b074b6134c95, agora podemos iniciar a mineração.
> miner.start()
null
> miner.stop()
null
> eth.getBalance("0xa9e98368b44b371cec7d205f9fe2b074b6134c95")
5.004e+21
> eth.getBalance("0xa9e98368b44b371cec7d205f9fe2b074b6134c95")
5.004e+21
> eth.accounts
["0xa9e98368b44b371cec7d205f9fe2b074b6134c95", "0xc061b852a26bedec5bd457b88c031c46a622f4ab"]
> eth.getBalance("0xc061b852a26bedec5bd457b88c031c46a622f4ab")
0
> web3.fromWei(eth.getBalance("0xa9e98368b44b371cec7d205f9fe2b074b6134c95"), "ether")
5004
> eth.getBalance(eth.accounts[0])
5.004e+21Para enviar \(100\) ethers da primeira para a segunda carteira:
> eth.sendTransaction({from: "0xa9e98368b44b371cec7d205f9fe2b074b6134c95", to: "0xc061b852a26bedec5bd457b88c031c46a622f4ab", value: 100})
Error: authentication needed: password or unlock
at web3.js:6365:9(39)
at send (web3.js:5099:62(29))
at <eval>:1:20(9)
> eth.sendTransaction({from: "0xa9e98368b44b371cec7d205f9fe2b074b6134c95", to: "0xc061b852a26bedec5bd457b88c031c46a622f4ab", value:web3.toWei(100, "ether")})
Error: authentication needed: password or unlock
at web3.js:6365:9(39)
at send (web3.js:5099:62(29))
at <eval>:1:20(13)
> personal.unlockAccount(eth.accounts[0])
ReferenceError: personal is not defined
at <eval>:1:1(0)O erro “Error: authentication needed: password or unlock” ocorre por que precisamos autorizar a transação. Em versões anteriores era possível desbloquear as contas via console javascript, conforme tentamos no Código acima personal.unlockAccount(eth.accounts[0]). Verificando a documentação o personal foi depreciado e não pode ser mais utilizado.
Na versão corrente é preciso utilizar o clef para fazer a autenticação em um terminal separado. O clef é um autenticador das operações, a Figura \(\ref{fig:clef:fluxo}\) apresenta o fluxo de autenticação de uma transição solicitada pelo usuário.

Então em um outro terminal inicie a instância do clef com o comando:
[rogerio@ryzen-nitro sepolia]$ clef --chainid 11155111 --keystore ~/.ethereum/sepolia/keystore --configdir ~/.ethereum/sepolia/clef --http
WARNING!
Clef is an account management tool. It may, like any software, contain bugs.
Please take care to
- backup your keystore files,
- verify that the keystore(s) can be opened with your password.
Clef is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the GNU General Public License for more details.
Enter 'ok' to proceed:
> ok
INFO [04-19|14:00:58.719] Using CLI as UI-channel
INFO [04-19|14:00:59.171] Loaded 4byte database embeds=268,621 locals=0 local=./4byte-custom.json
WARN [04-19|14:00:59.171] Failed to open master, rules disabled err="failed stat on /home/rogerio/.ethereum/sepolia/clef/masterseed.json: stat /home/rogerio/.ethereum/sepolia/clef/masterseed.json: no such file or directory"
INFO [04-19|14:00:59.172] Starting signer chainid=1,115,511 keystore=/home/rogerio/.ethereum/sepolia/keystore light-kdf=false advanced=false
INFO [04-19|14:00:59.184] Smartcard socket file missing, disabling err="stat /run/pcscd/pcscd.comm: no such file or directory"
INFO [04-19|14:00:59.184] Audit logs configured file=audit.log
INFO [04-19|14:00:59.186] HTTP endpoint opened url=http://127.0.0.1:8550/
INFO [04-19|14:00:59.186] IPC endpoint opened url=/home/rogerio/.ethereum/sepolia/clef/clef.ipc
------- Signer info -------
* extapi_ipc : /home/rogerio/.ethereum/sepolia/clef/clef.ipc
* intapi_version : 7.0.1
* extapi_version : 6.1.0
* extapi_http : http://127.0.0.1:8550/
------- Available accounts -------
0. 0xa9e98368B44b371ceC7d205F9fE2b074b6134C95 at keystore:///home/rogerio/.ethereum/sepolia/keystore/UTC--2023-04-17T00-51-24.03605278 5Z--a9e98368b44b371cec7d205f9fe2b074b6134c95
1. 0xc061b852A26BEdeC5Bd457b88c031c46a622f4ab at keystore:///home/rogerio/.ethereum/sepolia/keystore/UTC--2023-04-17T00-53-06.37987339 5Z--c061b85 2a26bedec5bd457b88c031c46a622f4abO clef iniciará e listará as contas disponíveis que irá controlar.
O arquivo para a comunicação IPC socket/pipe será criado dentro do datadir .ethereum/sepolia/ clef/clef.ipc, se preferir o caminho onde o arquivo será criado pode ser fornecido como parâmetro --ipcpath valor.
Volte ao terminal onde iniciou o geth e indique que as autentificações serão via clef com o parâmetro --signer=/home/rogerio/.ethereum/sepolia/clef/clef.ipc passando o caminho dado pelo clef.
[rogerio@ryzen-nitro execution]$ geth --sepolia --syncmode full --http --http.addr 127.0.0.1 --http.port 8559 --http.api "eth,net,web3,personal,engine,admin" --keystore ~/.ethereum/sepolia/keystore --authrpc.addr localhost --authrpc.port 8551 --authrpc.vhosts localhost --authrpc.jwtsecret ~/.ethereum/sepolia/geth/jwtsecret --nodiscover --maxpeers 15 --miner.etherbase=0xa9e98368b44b371cec7d205f9fe2b074b6134c95 --signer=/home/rogerio/.ethereum/sepolia/clef/clef.ipcRetorne ao console javascript, e execute novamente as transações, cada uma deverá ser autorizada no console do clef.
> eth.sendTransaction({from: "0xa9e98368b44b371cec7d205f9fe2b074b6134c95", to: "0xc061b852a26bedec5bd457b88c031c46a622f4ab", value: 100})No console do clef é possível autorizar e ver a transação assinada com hash: 0xb579cc595601e4aca546ce4e46bdcded7841bd7f50a0a78c505e839dd039b8b9 que é o mesmo id devolvido no console javascript.
-------------------------------------------
Request context:
NA -> ipc -> NA
Additional HTTP header data, provided by the external caller:
User-Agent: ""
Origin: ""
Approve? [y/N]:
> y
--------- Transaction request-------------
to: 0xc061b852A26BEdeC5Bd457b88c031c46a622f4ab
from: 0xa9e98368B44b371ceC7d205F9fE2b074b6134C95 [chksum ok]
value: 100 wei
gas: 0x5208 (21000)
maxFeePerGas: 1000000014 wei
maxPriorityFeePerGas: 1000000000 wei
nonce: 0x0 (0)
chainid: 0xaa36a7
Accesslist
Request context:
NA -> ipc -> NA
Additional HTTP header data, provided by the external caller:
User-Agent: ""
Origin: ""
-------------------------------------------
Approve? [y/N]:
> y
#\# Account password
Please enter the password for account 0xa9e98368B44b371ceC7d205F9fE2b074b6134C95
>
-----------------------
Transaction signed:
{
"type": "0x2",
"nonce": "0x0",
"gasPrice": null,
"maxPriorityFeePerGas": "0x3b9aca00",
"maxFeePerGas": "0x3b9aca0e",
"gas": "0x5208",
"value": "0x64",
"input": "0x",
"v": "0x0",
"r": "0xcfaf8674159cf0618393d32bc4e421969acf3bc1c7dfc5bc13224025cc5a6e5e",
"s": "0x44cbc80e7123b73846caf72eb13312b8ac8a2dc323173a4b58491b1112c2298c",
"to": "0xc061b852a26bedec5bd457b88c031c46a622f4ab",
"chainId": "0xaa36a7",
"accessList": [],
"hash": "0x298bb20795a584c9bd038d47323f592e072b66eace172833d27acaad8278281a"
}Com a autorização feita no console do clef será mostrado as informações da transação assinada, como o hash: 0x298bb20795a584c9bd038d47323f592e072b66eace172833d27acaad8278281a. Observe que no console javascript aparece o mesmo hash da transação para a transação que solicitamos:
> eth.sendTransaction({from: "0xa9e98368b44b371cec7d205f9fe2b074b6134c95", to: "0xc061b852a26bedec5bd457b88c031c46a622f4ab", value: 100})
"0x298bb20795a584c9bd038d47323f592e072b66eace172833d27acaad8278281a"
> Se buscarmos pelo recibo da transação ou verificarmos se o saldo da conta 1 foi alterado, veremos que a transação no foi efetivada ainda, pois a consulta devolve null e o saldo da conta ainda é zero.
> eth.sendTransaction({from: "0xa9e98368b44b371cec7d205f9fe2b074b6134c95", to: "0xc061b852a26bedec5bd457b88c031c46a622f4ab", value: 100})
"0x298bb20795a584c9bd038d47323f592e072b66eace172833d27acaad8278281a"
> eth.getTransactionReceipt("0x298bb20795a584c9bd038d47323f592e072b66eace172833d27acaad 8278281a")
null
> eth.getBalance(eth.accounts[1])
0
> eth.getBalance(eth.accounts[0])
5.004e+21É preciso minerar para a transação ser efetivada:
> miner.start()
null
> eth.getBalance(eth.accounts[1])
100
> miner.stop()
null
> eth.getBalance(eth.accounts[0])
5.0859999999999998529e+21
> eth.getBalance(eth.accounts[1])
100
> Agora sim, é possível recuper o recibo da transação. Desde do fork para a versão Byzantium, a Ethereum fornece uma forma de se verficar se a transação deu certo ou falhou, o campo status no recibo indica a situação (0 - falhou e 1 - foi executada com sucesso).
> eth.getTransactionReceipt("0x298bb20795a584c9bd038d47323f592e072b66eace172833d27acaad 8278281a")
{
blockHash: "0x1e3ae615a7d676cc51983ea066e2cda3a5d7702d27255065b330591cc3b9062f",
blockNumber: 2503,
contractAddress: null,
cumulativeGasUsed: 21000,
effectiveGasPrice: 1000000007,
from: "0xa9e98368b44b371cec7d205f9fe2b074b6134c95",
gasUsed: 21000,
logs: [],
logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
status: "0x1",
to: "0xc061b852a26bedec5bd457b88c031c46a622f4ab",
transactionHash: "0x298bb20795a584c9bd038d47323f592e072b66eace172833d27acaad8278281a",
transactionIndex: 0,
type: "0x2"
}Ao enviar outra quantidade para a segunda conta é preciso autorizar a transação no console do clef e minerar novamente para ela ser efetivada.
> eth.sendTransaction({from: "0xa9e98368b44b371cec7d205f9fe2b074b6134c95", to: "0xc061b852a26bedec5bd457b88c031c46a622f4ab", value: 1000})
"0x667f9570b629fdd437b112e4b5f388cbbe68efb43e0bdbb75bf9db473cbd00fc"
> eth.getBalance(eth.accounts[1])
100
> miner.start()
null
> eth.getBalance(eth.accounts[1])
1100
> miner.stop()
null
> eth.getBalance(eth.accounts[1])
1100
> eth.getBalance(eth.accounts[0])
5.1779999999999997049e+21
> No terminal de execução do geth aparece que a transação foi submetida e após a mineração os saldos das contas foram atualizados.
INFO [04-19|15:10:01.663] Submitted transaction hash=0x667f9570b629fdd437b112e4b5f388cbbe68efb43e0bdbb75bf9db473cbd00fc from=0xa9e98368B44b371ceC7d205F9fE2b074b6134C95 nonce=1 recipient=0xc061b852A26BEdeC5Bd457b88c031c46a622f4ab value=1000A transação 0x667f9570b629fdd437b112e4b5f388cbbe68efb43e0bdbb75bf9db473cbd00fc foi autorizada e podemos verificar o saldo das carteiras.
> eth.getTransactionReceipt("0x667f9570b629fdd437b112e4b5f388cbbe68efb43e0bdbb75bf9db47 3cbd00fc")
{
blockHash: "0x30643a61e054cc3a2e5ce04c67e4c14ed192a889cede500bcf214d754540fe6b",
blockNumber: 2544,
contractAddress: null,
cumulativeGasUsed: 21000,
effectiveGasPrice: 1000000007,
from: "0xa9e98368b44b371cec7d205f9fe2b074b6134c95",
gasUsed: 21000,
logs: [],
logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
status: "0x1",
to: "0xc061b852a26bedec5bd457b88c031c46a622f4ab",
transactionHash: "0x667f9570b629fdd437b112e4b5f388cbbe68efb43e0bdbb75bf9db473cbd00fc",
transactionIndex: 0,
type: "0x2"
}
> eth.accounts
["0xa9e98368b44b371cec7d205f9fe2b074b6134c95", "0xc061b852a26bedec5bd457b88c031c46a622f4ab"]
> web3.fromWei(eth.getBalance("0xa9e98368b44b371cec7d205f9fe2b074b6134c95"), "ether")
5177.9999999999997049
> web3.fromWei(eth.getBalance("0xc061b852a26bedec5bd457b88c031c46a622f4ab"), "ether")
1.1e-15Surgiu após a instalação e execução a seguinte mensagem:
All I see is, beacon client online, but never received consensus updates. Please ensure your beacon client is operational to follow the chain!
I connected the consensus client and it is syncing but not the geth client.Procurando pela mensagem chegamos à resposta no forum https://ethereum.stackexchange.com/questions/136810/geth-does-not-sync-proof-of-stake diz que é possível fazer uma sincronização rápida, usando um checkpoint.
Your
gethclient will not startsyncbefore yourconsensus-clientdoes not sync completely. If you are usingprysmconsensus client, you can usecheckpointsync feature to sync in minutes so you don’t need to wait.This is also verified by
go-ethereumteam in this issue.
Clicando-se no link checkpoint você será direcionado para a página da Figura:

Clicando no botão Get started! ele vai para as opções de configuração de cada um dos clientes de consenso, conforme a Figura \(\ref{fig:checkpointz:prysm}\).

prysm No passo a passo da configuração para o Prysm, no Step 2 fala para adicionarmos os argumentos checkpoint sync para o nosso cliente:
--checkpoint-sync-url=https://checkpoint-sync.sepolia.ethpandaops.io
--genesis-beacon-api-url=https://checkpoint-sync.sepolia.ethpandaops.ioO comando do terminal do prysm deve ser alterado para:
[rogerio@ryzen-nitro prysm]$ ./prysm.sh beacon-chain --execution-endpoint=http://localhost:8551 --sepolia --jwt-secret=~/.ethereum/sepolia/geth/jwtsecret --genesis-state=genesis.ssz --suggested-fee-recipient=0xa9e98368b44b371cec7d205f9fe2b074b6134c95 --checkpoint-sync-url=https://checkpoint-sync.sepolia.ethpandaops.io --genesis-beacon-api-url=https://checkpoint-sync.sepolia.ethpandaops.ioNa Option B do Step 4 é necessário recuperar os valores do slot number e do state_root.
1. Open http://YOUR\_NODE\_IP:YOUR\_NODE\_PORT/eth/v1/beacon/headers/finalized in your browser.
2. Find the slot number.
3. Find the state_root value.
Será necessário conhecer o IP e a porta do beacon node. A porta padrão para o Prysm é 3500.
Abrindo no navegador o link http://localhost:3500/eth/v1/beacon/headers/finalized será retornado o JSON com as informações:
{
"data":{
"root":"0xc41093353f2a6bb5b63ac406ac040d95a28cf54ec3d6f0f232955d8e2456727c",
"canonical":true,
"header":{
"message":{
"slot":"3149344",
"proposer_index":"683",
"parent_root":"0xe5af6c8eaaeb1fb511966164a4093b77e18a160a921765a10c686d38f55240f1",
"state_root":"0xa055b83978259840e18c2a0e6e625982f2944ff8d906c01e7bab0bc2883cb793",
"body_root":"0xd5e597557fe3145b1485815e2e42b1e56640188df6136056313cfc37c07eb5d3"
},
"signature":"0x92f5babf32748c31f74d988869b7f7bc3f251056d117a4e63882fa2e3fa4b219e47f949
9f17f965f39d877ea83cf0cbf0de9879350ebc3024fb6fb6f37e9d16fae379ec0e127e7bef5e0a6d6587d2
cfb885b824d59d1d7cf78e9f43daf987fe7"
}
},
"execution_optimistic":true,
"finalized":true
}Uma outra opção dada na Option C é utilizar os comandos curl e o jq e recuperar a informação pelo terminal.
[rogerio@ryzen-nitro prysm]$ curl -s http://localhost:3500/eth/v1/beacon/headers/finalized | jq .'data.header.message'
{
"slot": "3154944",
"proposer_index": "187",
"parent_root": "0xb89973544675c63c5f19f5904b8eaa164fc41c688ecb3078ee0dc62a62996c9b",
"state_root": "0x041fb39788896d2c0662e104ab7393124140546aacbeaedc2b7f94b9b5fcc548",
"body_root": "0x128fe8300ed3e76226ca14955790583df1921ed9c65d111804db319b7b6118ba"
}
[rogerio@ryzen-nitro prysm]$Para verificar seu slot e seu state_root abra uma outra instância do site Checkpointz, note que deve ser uma instância diferente da que você está lendo esse tutorial.
Verifique a tabela do histórico de limites de época finalizados e procure a linha que contém o valor do seu slot e tenha certeza que o seu state_root casa com o listado. Se coincidir, ok!
Caso contrário, você deveria iniciar do início novamente limpando seu nó beacon e iniciando novamente os passos. Existem a opção do prysm --clear-db para limpar o banco de dados.
Pelo visto a parte que envolvia a mineração não funciona mais. Ao executar o comando no console javascript miner.start() a seguinte mensagem de erro aconteceu:
panic: ethash (pow) sealing not supported any more
goroutine 4324 [running]:
github.com/ethereum/go-ethereum/consensus/ethash.(*Ethash).Seal(0xc000199680?, {0x5607920e8325?, 0xc000c85ce0?}, 0xc000c85de8?, 0xc000c85ce0?, 0x8ba4636bba1627dc?)
github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:84 +0x25
github.com/ethereum/go-ethereum/consensus/beacon.(*Beacon).Seal(0xc0002d1bf0, {0x560793c496a8, 0xc000601c00}, 0xc0002381e0, 0x0?, 0x1?)
github.com/ethereum/go-ethereum/consensus/beacon/consensus.go:393 +0x8d
github.com/ethereum/go-ethereum/miner.(*worker).taskLoop(0xc0004da6c0)
github.com/ethereum/go-ethereum/miner/worker.go:616 +0x2fd
created by github.com/ethereum/go-ethereum/miner.newWorker in goroutine 1
github.com/ethereum/go-ethereum/miner/worker.go:285 +0x8f8
[rogerio@ryzen-nitro sepolia]$ Outras mensagens de erros envolvendo o Prysm podem ser encontradas na documentação https://docs.prylabs.network/docs/troubleshooting/issues-errors.
5.16 Pedindo Recursos para um Faucet
Uma alternativa ao teste com a mineração local seria solicita recursos a um faucet, ao https://sepoliafaucet.com/, por exemplo.
Nesses sistemas, você fornece o hash da conta desejada e uma pequena quantia será enviada para seu endereço. A Figura \(\ref{fig:transacao:faucet:01}\) apresenta a interface do faucet.

As Figuras \(\ref{fig:transacao:faucet:02}\) e \(\ref{fig:transacao:faucet:03}\) apresentam detalhes da transação gerada.


5.17 Importando contas do Metamask
Criar um aquivo com o nome do hash da conta. Exportar no Metamask a chave privada e salvar como conteúdo desse arquivo.
[rogerio@ryzen-nitro ~]$ nano 0x9DBf97c71AeD31302e07e34236308C97f882f914.txt
[rogerio@ryzen-nitro ~]$ clef --chainid 11155111 --keystore ~/.ethereum/sepolia/keystore importraw 0x9DBf97c71AeD31302e07e34236308C97f882f914.txt
WARNING!
Clef is an account management tool. It may, like any software, contain bugs.
Please take care to
- backup your keystore files,
- verify that the keystore(s) can be opened with your password.
Clef is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the GNU General Public License for more details.
Enter 'ok' to proceed:
> ok
## Password
Please enter a password for the imported account
>
-----------------------
## Password
Please repeat the password you just entered
>
-----------------------
## Info
Key imported:
Address 0x9DBf97c71AeD31302e07e34236308C97f882f914
Keystore file: /home/rogerio/.ethereum/sepolia/keystore/UTC--2024-09-12T14-29-06.549845800Z--9dbf97c71aed31302e07e34236308c97f882f914
The key is now encrypted; losing the password will result in permanently losing
access to the key and all associated funds!
Make sure to backup keystore and passwords in a safe location.5.18 Comandos Finais
A Figura \(\ref{fig:terminais:comandos}\) apresenta os comandos para cada um dos terminais.

O comando para o console do clef:
[rogerio@ryzen-nitro clef]$ clef --chainid 11155111 --keystore ~/.ethereum/sepolia/keystore --configdir ~/.ethereum/sepolia/clef --httpO comando para o console do Geth:
[rogerio@ryzen-nitro sepolia]$ geth --sepolia --syncmode full --http --http.addr 127.0.0.1 --http.port 8559 --http.api "eth,net,web3,personal,engine,admin" --keystore ~/.ethereum/sepolia/keystore --authrpc.addr localhost --authrpc.port 8551 --authrpc.vhosts localhost --authrpc.jwtsecret ~/.ethereum/sepolia/geth/jwtsecret --nodiscover --maxpeers 15 --miner.etherbase=0xa9e98368B44b371ceC7d205F9fE2b074b6134C95 --signer=/home/rogerio/.ethereum/sepolia/clef/clef.ipc --verbosity 3O comando para o console do prysm:
[rogerio@ryzen-nitro prysm]$ ./prysm.sh beacon-chain --execution-endpoint=http://localhost:8551 --sepolia --jwt-secret=~/.ethereum/sepolia/geth/jwtsecret --suggested-fee-recipient=0xa9e98368b44b371cec7d205f9fe2b074b6134c95 --genesis-state=genesis.ssz --checkpoint-sync-url=https://checkpoint-sync.sepolia.ethpandaops.io --genesis-beacon-api-url=https://checkpoint-sync.sepolia.ethpandaops.io --clear-dbO comando para o console do javascript:
[rogerio@ryzen-nitro ~]$ geth attach /home/rogerio/.ethereum/sepolia/geth.ipc
Welcome to the Geth JavaScript console!
instance: Geth/v1.12.2-stable-bed84606/linux-amd64/go1.21.0
coinbase: 0xa9e98368b44b371cec7d205f9fe2b074b6134c95
at block: 0 (Sun Oct 03 2021 10:24:41 GMT-0300 (-03))
datadir: /home/rogerio/.ethereum/sepolia
modules: admin:1.0 debug:1.0 engine:1.0 eth:1.0 miner:1.0 net:1.0 rpc:1.0 txpool:1.0 web3:1.0
To exit, press ctrl-d or type exit
> 6 Referências
6.1 Leitura Recomendada
[alertblock]{Leitura Recomendada}
Capítulo 11: Ethereum 101
Capítulo 12: Futher Ethereum
[/alertblock]
6.2 Word Cloud
