Tutorial sobre como publicar um contrato inteligente na Testnet do Ethereum

Tutorial sobre como publicar um contrato inteligente na Testnet do Ethereum

By Melissa Eggersman - min. de leitura
Atualizado 04 junho 2020

Este é um tutorial passo a passo de como publicar um smart contract na rede de teste do Ethereum.

Instale o geth

Primeiramente instale a linha de comando da Ethereum geth:https://ethereum.org/cli. Neste tutorial foi utilizado o Ubuntu.

Escreva o contrato

Os smart contracts do Ethereum são escritos na linguagem Solidity. Para saber mais sobre a linguagem acesse a documentação oficial, e há também um ótimo tutorial oferecido pela LoomNetwork.

Crie um diretório qualquer para começar o tutorial. Crie um arquivo chamado OlaMundo.sol e preencha com o seguinte código:

pragma solidity ^0.4.23;
contract Mortal {
    address proprietario;

    constructor() public {
        proprietario = msg.sender;
    }

    function apagar() public {
        if (msg.sender == proprietario) {
            selfdestruct(proprietario)
        }
    }
}

contract OlaMundo is Mortal {

    string mensagem;

    constructor(string _mensagem) public {
        mensagem = _mensagem;
    }

    function digaOla() public constant returns (string) {
        return mensagem;
    }
}

Não vou entrar nos detalhes da linguagem aqui, vamos direto para a parte prática.

Publicando o contrato

Para que o contrato seja publicado na rede, é necessário compilá-lo. Para isso será necessário instalar o compilador do Solidity. O seguinte comando realiza as seguintes operações:

  • Compila o contrato OlaMundo.sol retornando um JSON
  • Concatena o JSON retornado da compilação à uma declaração de uma variável em JavaScript
  • Grava a declaração da variável num arquivo chamado compilado.js
$ echo "var olaMundoCompilado=`solc --optimize --combined-json abi,bin,interface OlaMundo.sol`" > compilado.js

Acesse o console do geth rodando:

$ geth --rinkeby --verbosity 0 console --mine

Esse comando abre o console interativo que nos dá acesso à API JavaScript para interagirmos com o ambiente Ethereum. Note que passamos o parâmetro — rinkeby que configura o console para rodar na rede de testes do Ethereum.

Carregue o arquivo do contrato compilado com:

> loadScript('compilado.js')

Vamos guardar a Application Binery Interface (ABI) numa variável:

> var abi = JSON.parse(olaMundoCompilado.contracts['OlaMundo.sol:OlaMundo'].abi);

Vamos guardar também o código binário do smart contract:

> var bin = '0x'+olaMundoCompilado.contracts['OlaMundo.sol:OlaMundo'].bin;

Para publicar nosso smart contract, será necessário ter uma instância de um objeto de contrato no JavaScript:

> var contrato = eth.contract(abi);

Também será necessário ter uma conta para publicá-lo. É muito simples criar uma conta pelo console é só executar o seguinte comando:

> personal.newAccount()

O console irá perguntar por uma senha para poder criptografar a nova conta, nós iremos precisar dela mais para frente. Se tudo der certo, o console irá devolver o endereço da nova conta que será um hash grande. Não se preocupe em guardar esse hash, pois ele é facilmente obtido com o comando que lista todas as contas:

eth.accounts

Para que o contrato seja publicado, precisamos de eth para pagar os mineradores por publicar o contrato.
Para conseguir eth para a conta de teste, copie o endereço da conta criada e faça um post público contendo somente o endereço da conta no Facebook, Twitter ou Google Plus.
Copie o permalink do post e coloque a URL no campo deste formulário: https://www.rinkeby.io/#faucet.
Escolha uma das opções e espere até completar.
Para verificar se deu certo, consulte o saldo da conta:

> eth.getBalance(eth.accounts[0])

Antes de executarmos o código de publicação, precisamos desbloquear a conta para pagar a publicação:

> personal.unlockAccounts(eth.accounts[0]);

Hora de publicar

Vamos chamar o método new do nosso objeto contrato criado anteriormente passando a mensagem que será guardada no nosso smart contract, a conta proprietária do contrato, o binário, a quantidade de gas que iremos pagar para que o contrato seja publicado, e uma função que será executada assim que houver uma modificação na publicação:

> var meuContrato = contrato.new('Olá mundo descentralidado!',{ from: eth.accounts[0], data: bin, gas: 4700000},
  function (e, contract) {
    if (typeof contract.address !== 'undefined') {
         console.log('Contrato publicado! Endereço: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
    }
  }
);

Deve retornar o seguinte, só que com os hashs diferentes:

> Contrato publicado! Endereço: 0x3026212e73caf773e9bc5397846fbcaf9c61c96a transactionHash: 0xd967b5e545018014830c077e74b3e4ca3ec3a962646b5d934daea942c7110bc7

Interagindo com o contrato

Localmente

Agora nosso contrato está online! Podemos utilizar a variável do comando anterior para chamar os métodos via JavaScript:

> meuContrato.digaOla();
"Olá mundo descentralidado!"

Público

Digamos que você quer acessar seu contrato a partir de uma ÐApp ou de outro console, você não terá mais a referência do retorno da publicação como na situação anterior. Para acessar qualquer smart contract publicado você precisa ter acesso à ABI e o endereço.

> var meuContratoPublico = eth.contract(meuContrato.abi).at(meuContrato.address);
> meuContratoPublico.digaOla()

Apagando o contrato

Smart contracts na rede Ethereum são eternos por padrão, mas podemos programar para que esse contrato seja inutilizado:

> meuContrato.apagar.sendTransaction({from:eth.accounts[0]})

Após alguns instantes a transação será efetuada, então podemos verificar:

> eth.getCode(meuContrato.address)

O que deve retornar:

"0x"

Para mais detalhes (TL;DR) acesse: https://github.com/ethereum/go-ethereum/wiki/Contract-Tutorial

(Tiago A. Full-stack developer).

Fonte: https://medium.com/@tiagoab/hello-world-em-ethereum-50aeb1bd5d54

Guia do Bitcoin

Mantenha-se informado todos os dias sobre Bitcoin!
Telegram: https://telegram.me/guiadobitcoin
Facebook: https://www.facebook.com/guiadobitcoin/
Twitter: https://twitter.com/guiadobitcoin
Feed RSS: https://guiadobitcoin.com.br/feed/