Segundo Tutorial: Java e Ethereum - Smart Contracts


Agora que já vimos uma operação simples de envio e recebimento de valores entre contas / wallets no Ethereum, vamos entrar no mundo dos contratos inteligentes.

Um contrato inteligente é um software cujo deploy é feito na rede Ethereum, ou seja, é distribuido ao redor de todos os nós da rede.

Para este exemplo vamos utilizar a linguagem Solidity para criação do contrato, você também pode utilizar a linguagem Serpent.

Vamos criar um contrato bem simples, que já está no repositório do GitHub:

https://github.com/alexjavabraz/javaParity

Inicializar o Parity:

parity --chain testnet --rpcapi "eth,net,web3,personal,parity"


O Smart Contract de exemplo está dentro do projeto Maven.

src/main/resources/ContratoAlex.sol




1-Instalando o solc no Linux Ubuntu:

O Solc é o solidity comand line compiler, é com ele que iremos compilar nossos smart contracts, gerando então os arquivos .abi e .bin.

O arquivo .abi (application binary interface specification) é a especificação do Smart Contract, por meio desta especificação é que outros contratos saberão quais métodos estão disponíveis. É um arquivo no formato JSON.

O arquivo .bin é o contrato compilado contento hex-encoded binarizado.

sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update

sudo apt-get install solc

Neste link você pode baixar a versão para windows:

2-Baixando o projeto web3J:

Vamos baixar o zip web3J :

No momento o último release é o v2.2.2



Descompacte o arquivo ZIP:

$ unzip web3j-.zip
   creating: web3j-1.0.2/lib/
  inflating: web3j-1.0.2/lib/core-1.0.2-all.jar
   creating: web3j-1.0.2/bin/
  inflating: web3j-1.0.2/bin/web3j
  inflating: web3j-1.0.2/bin/web3j.bat
$ ./web3j-/bin/web3j

Dentro do diretório DIRETORIO_WEB3J\bin você encontrará o executável web3j (linux), ou o arquivo em lotes (web3j.bat para windows).

Sendo DIRETORIO_WEB3J o local onde você descompactou o arquivo do web3j.

3-Compilando o contrato .SOL:

solc ./CAMINHO/ContratoAlex.sol --bin --abi --overwrite --optimize -o /CAMINHO_RESOURCES/

Onde /CAMINHO_RESOURCES é o caminho dentro do seu projeto Maven onde ficam os resources dentro do projeto, exemplo:

c:\projetos\ethereum\parity\projetoJava\src\main\resources\ - No Windows
/home/alexjavabraz/projetos/javaParity/src/main/resources/ - No Linux

Este comando irá criar os arquivos:

ContratoAlex.abi - Um arquivo JSON com as
ContratoAlex.bin - O arquivo binário do seu contrato


4-Gerando o objeto Java:

Muito bem, agora que você já tem o Smart Contract (arquivo .sol) e á partir dele já criou os arquivos bin e abi no passo 3, agora você precisa gerar os wrappers Java, para poder interagir com seu contrato, dentro do código Java.

Para isso, vá até o local onde baixou o web3j no passo 2.

./DIRETORIO_WEB3J/bin/web3j solidity generate /CAMINHO_RESOURCES/ContratoAlex.bin  /CAMINHO_RESOURCES/ContratoAlex.abi -o /src/main/java -p nome_do_seu_pacote


5- Fazendo deploy do contrato no Parity:

Você pode fazer deploy do seu contrato dentro do Parity, na opção Develop => New.

O parity gera a interface ABI, e o binário, e também avisa se o seu código contém algo de errado, veja a mensagem no campo COMPILER MESSAGES.


Mas você pode fazer o teste chamando o meu contrato, ou o de algum amigo, já que você está num ambiente decentralizado para o teste é bem mais interessante chamar outro contrato.




Depois do deploy o contrato recebe um endereço:

0x1E386bF4Ed55ca0e4FA1F551f92b2ef8369Af774



6- Interagindo com o contrato dentro do código Java:

Agora você tem o endereço do contrato na rede Ethereum.

Vamos utilizar este endereço para interagir com o Smart Contract.

0x1E386bF4Ed55ca0e4FA1F551f92b2ef8369Af774

Dentro do projeto Java que está no GitHub, na classe UsingOnParity.java criei o método callContract.


 

Explicando um pouco sobre este método:

O objeto accountFile é o arquivo onde se encontram as informações referentes á sua conta, deixei a minha como um exemplo de onde você obtém este arquivo no Linux, na rede de teste, o Parity irá criar um arquivo para cada ambiente.

7 - Alterando o programa:

Você precisará alterar os seguintes atributos:

static final String WALLET_ORIGEN = a sua carteira

static final String WALLET_PASSWORD = a senha da sua carteira

8 - Consultando o novo valor da variável lastMessage:

Dentro do Parity, clique em Contractss => Watch


Selecione a opção Custom Contract


Você precisará preencher os campos, network address, com o endereço do contrato:
0x1E386bF4Ed55ca0e4FA1F551f92b2ef8369Af774

Contract Name: Com algum nome para o contrato
Contract Description: Com alguma descrição para o contrato


Após isso você conseguirá visualizar o valor armazenado no atributo lastMessage:


9 - Obtendo Ethers para teste:

http://faucet.ropsten.be:3001
https://github.com/kovan-testnet/faucet
https://kovan.etherscan.io/

10 - Referências:

http://solidity.readthedocs.io/en/develop/installing-solidity.html
https://ethereumbuilders.gitbooks.io/guide/content/en/solidity_tutorials.html
https://web3j.readthedocs.io/en/latest/smart_contracts.html
https://github.com/web3j/web3j#java-smart-contract-wrappers
https://github.com/web3j/web3j
https://solidity.readthedocs.io/en/develop/units-and-global-variables.html
https://github.com/kovan-testnet/faucet
https://web3j.io/
https://docs.web3j.io/command_line.html
https://github.com/web3j/web3j/releases/tag/v2.2.2

Comentários

Postagens mais visitadas deste blog

Introdução ao Empreendedorismo

Economia - Princípio da Utilidade Marginal Decrescente

Integrando seu site com o facebook