Tutorial sobre como publicar um contrato inteligente na Testnet do Ethereum
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
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/