Utilizando ganache (testrpc) para testes e desenvolvimento de smart contracts

Marcelo Morgado
2 min readMay 29, 2018

--

Não é necessário nem desejável rodar fullnode (mesmo que na testnet) caso nosso objetivo seja realizar testes preliminares em nossos projetos Ethereum.

Além do grande consumo de disco e rede, o tempo de espera para a sincronização da blockchain não é pequeno.

Foi para evitar este desperdício de tempo e recursos que foi criada a ferramenta ganache-cli (anteriormente chamada de testrpc).

Ela simula o comportamento de um fullclient (geth / parity) através de funções RPC. Desta forma podemos testar nosso código de forma mais rápida e fácil.

Instalação

npm install -g ganache-cli

Utilização

Após a instalação basta executa-lo:

ganache-cli

A partir deste momento, o serviço está rodando e a porta 8545 (padrão RPC Ethereum) está aceitando conexões. Se o ganache está sendo executado corretamente, você visualizará em seu console os accounts criados para nesta sessão. Segue exemplo:

Ganache CLI v6.1.0 (ganache-core: 2.1.0)Available Accounts
==================
(0) 0x8e8837a1ebf3cd04813773ce6e50f02756d74a6f
(1) 0xca8d4799d2128656a6ce4b164950116e6f6e7113
(2) 0x19ff869d8db2679fc6583597007eac0f694b3584
(3) 0x5831adaaba4a2d6e8e6efdf2cd0754ebc4aa838d
(4) 0xb790d2eda9e106153de693312642c7203423f0e9
(5) 0x935f479e545e29d3e23afaa4e19d3ebc716a508a
(6) 0xb55283997fa83cf0378443fe50e88ba9eb6ace32
(7) 0x62ed09c8b4a7187a2259827e293cf73075c46cba
(8) 0xe2c113cd2123dacdc393f13267bc01a7b061b8f0
(9) 0x54dac74d375f918040497f52106cdd5964223d6a
Private Keys
==================
(0) 45b2e94786d9feae139bce293b5e07b3ead3ec23a21f0abedafa270c08c9a154
(1) fda32c0f26a167b0dd3d44b763beb351bd36aa778d397c685b755ace7348fbda
(2) 3de0ec9a46e8fbcf496e946d57024f7f715ca9bcb5a15e67fd56dade6ae81cf2
(3) 62569ae138323445e952b690f30c82443fc40028a924c3c67206ebe560bed465
(4) 2942b2340002e5440fb987caefb99344c7e183f5bf79ce95d1d82024d0193af1
(5) a7a9be47990759256300d304f62490530cb63d918113942ac77ee70695120743
(6) 32dee17a20f3de83ef8279b0a870f2f733149e72b1bde9a33356dbdb78b65eea
(7) e15f2cb38401a790a0c74bbdd2745a819ff6a12a89616baa4369c2d14a82c5d0
(8) 158289f8f5cae345ef5ed506a03fc1e7a299eacf408d3891ab7bac3451da71b5
(9) a9ab56a024d8238b9ce3772dc84c4950fe73eb8d54de3fd9f1055555891fe412
HD Wallet
==================
Mnemonic: nose elegant car damp secret output badge process ritual panel decline mad
Base HD Path: m/44'/60'/0'/0/{account_index}
Listening on localhost:8545

Foram criadas 10 accounts para testes. Além de seus address são exibidas suas chaves privadas.

Obs: Os accounts mudam a cada nova execução.

Testando

Utilizaremos agora o geth para se conectar via RPC ao ganache e assim simularmos alguns comandos. O comportamento é semelhante ao observado se interagirmos com nó testnet/mainnet.

O geth é o cliente oficial do Ethereum, além de usado para executar fullnode ele nos permite acessar o console a partir da porta RPC. É isso que iremos fazer agora:

geth attach http://localhost:8545

Executaremos alguns comandos básicos para verificar o comportamento de nosso “nó” ganache.

> web3.eth.accounts
[“0x8e8837a1ebf3cd04813773ce6e50f02756d74a6f”, “0xca8d4799d2128656a6ce4b164950116e6f6e7113”, “0x19ff869d8db2679fc6583597007eac0f694b3584”, “0x5831adaaba4a2d6e8e6efdf2cd0754ebc4aa838d”, “0xb790d2eda9e106153de693312642c7203423f0e9”, “0x935f479e545e29d3e23afaa4e19d3ebc716a508a”, “0xb55283997fa83cf0378443fe50e88ba9eb6ace32”, “0x62ed09c8b4a7187a2259827e293cf73075c46cba”, “0xe2c113cd2123dacdc393f13267bc01a7b061b8f0”, “0x54dac74d375f918040497f52106cdd5964223d6a”]

Reparem que 1) Os accounts no console são os mesmos que foram exibidos quando rodamos o ganache e 2) Todos os comandos que são executados são mostrados na tela do ganache.

> web3.fromWei(web3.eth.getBalance(web3.eth.accounts[0]), 'ether');
100

A primera das 10 accounts foi inicializada com 100 ethers de saldo.

Vamos simular agora a transação entre contas

> web3.eth.sendTransaction({from: web3.eth.accounts[0], to: web3.eth.accounts[1], value: web3.toWei(50, ‘ether’)});
“0x5ba07cff6614e0cd4b79f2425318069a4db31d659957077b486f43b8c4e13522”

Realizamos a transferência de 50 ethers do account (0) 0x8e8837a1ebf3cd04813773ce6e50f02756d74a6f para a account (1) 0xca8d4799d2128656a6ce4b164950116e6f6e7113 e o TXID desta transação foi 0x5ba07cff6614e0cd4b79f2425318069a4db31d659957077b486f43b8c4e13522. Podemos verificar a movimentação dos fundos consultando o saldo das accounts:

> web3.fromWei(web3.eth.getBalance(web3.eth.accounts[0]), ‘ether’);
49.999999999999979
> web3.fromWei(web3.eth.getBalance(web3.eth.accounts[1]), ‘ether’);
150

Conclusão

Após a instalação do ganache, passamos a dispor de um simulador de node Ethereum em poucos minutos.

Mostramos via comandos que o comportamento é similar ao obtido em nós reais (testnet ou mainet) com a vantagem de não termos que esperar confirmação já que neste ambiente as transações são confirmadas imediatamente. Esta ferramenta nos será ainda mais útil quando formos executar testes em nossos Smart Contracts, o que mostrarei no próximo texto quando irei falar sobre o uso do Truffle, framework muito utilizada para o desenvolvimento de smart contracts Ethereum.

--

--