Criando e implantando contratos inteligentes com solidez

Criando e implantando contratos inteligentes com solidez

1. Visão geral

A capacidade de executarsmart contracts é o que tornou o blockchain Ethereum tão popular e perturbador.

Antes de explicarmos o que é um contrato inteligente, vamos começar com uma definição deblockchain:

Blockchain é um banco de dados público que mantém um registro permanente de transações digitais. Ele opera como um sistema transacional sem confiança, uma estrutura na qual os indivíduos podem fazer transações ponto a ponto sem precisar confiar em terceiros ou entre si.

Vamos ver como podemos criar contratos inteligentes no Ethereum comsolidity:

2. Ethereum

O Ethereum é uma plataforma que permite às pessoas escrever aplicativos descentralizados usando a tecnologia blockchain de forma eficiente.

Um aplicativo descentralizado (Dapp) é uma ferramenta para pessoas e organizações em lados diferentes de uma interação, usada para se reunir sem qualquer intermediário centralizado. Os primeiros exemplos de Dapps incluem BitTorrent (compartilhamento de arquivos) e Bitcoin (moeda).

Podemos descrever o Ethereum como uma blockchain com uma linguagem de programação integrada.

2.1. Máquina Virtual Ethereum (EVM)

Do ponto de vista prático, o EVM pode ser pensado como um grande sistema descentralizado contendo milhões de objetos, chamadosaccounts, que podem manter um banco de dados interno, executar código e se comunicar.

O primeiro tipo de conta é provavelmente o mais familiar para o usuário médio que usa a rede. Seu nome éEOA (Conta de propriedade externa); ele é usado para transmitir valor (comoEther) e é controlado por uma chave privada.

Por outro lado, existe um outro tipo de conta que é acontract.. Vamos em frente e ver do que se trata:

3. O que é um contrato inteligente?

Asmart contract é um script autônomo geralmentewritten in Solidity and compiled into binary or JSON and deployed to a specific address on the blockchain. Da mesma forma que podemos chamar um endpoint de URL específico de uma API RESTful para executar alguma lógica por meio de umHttpRequest, podemos da mesma forma executarsmart contract implantado em umaddress específico enviando dados corretos junto com o Ethereum necessário para chamar o Solidityfunction implantado e compilado.

Do ponto de vista comercial,it means that smart contract functions can be inherently monetized (semelhante a uma função do AWS Lambda que permite aos usuários pagarper compute cycle em vez deper instance). É importante ressaltar quesmart contract functions não precisa custar Ethereum para ser executado.

Em termos simples, podemos versmart contract como uma coleção de código armazenado na rede blockchain que define as condições com as quais todas as partes que usam o contrato concordam.

Isso permite que os desenvolvedores criem coisas que ainda não foram inventadas. Pense nisso por um segundo - não há necessidade de intermediários e também não há risco de contraparte. Podemos criar novos mercados, armazenar registros de dívidas ou promessas e garantir que temos os consensos da rede que valida as transações.

Qualquer pessoa pode implantar um contrato inteligente no banco de dados descentralizado por uma taxa proporcional ao tamanho de armazenamento do código que o contém. Os nós que desejam usar o contrato inteligente devem, de alguma forma, indicar o resultado de sua participação para o restante da rede.

3.1. Solidez

A principal linguagem usada no Ethereum éSolidity - que é uma linguagem do tipo Javascript desenvolvida especificamente para escrever contratos inteligentes. A solidez é digitada estaticamente, suporta herança, bibliotecas e tipos complexos definidos pelo usuário, entre outros recursos.

O compilador de solidez transforma o código em bytecode EVM, que pode ser enviado para a rede Ethereum como uma transação de implantação. Essas implantações têm taxas de transação mais substanciais do que as interações com contratos inteligentes e devem ser pagas pelo proprietário do contrato.

4. Criando um contrato inteligente com solidez

A primeira linha em um contrato de solidez define a versão do código-fonte. Isso é para garantir que o contrato não se comporte de maneira diferente repentinamente com uma nova versão do compilador.

pragma solidity ^0.4.0;

Para nosso exemplo, o nome do contrato éGreeting e como podemos ver a criação dele é semelhante a uma classe em Java ou outra linguagem de programação orientada a objetos:

contract Greeting {
    address creator;
    string message;

    // functions that interact with state variables
}

Neste exemplo, declaramos duas variáveis ​​de estado:creatoremessage. No Solidity, usamos o tipo de dados denominadoaddress para armazenar endereços de contas.

Em seguida, precisamos inicializar as duas variáveis ​​no construtor.

4.1. Construtor

Declaramos um construtor usando a palavra-chavefunction seguida do nome do contrato (assim como em Java).

O construtor é uma função especial que é invocada apenas uma vez quando um contrato é implantado pela primeira vez no blockchain Ethereum. Só podemos declarar um único construtor para um contrato:

function Greeting(string _message) {
    message = _message;
    creator = msg.sender;
}

Também injetamos a string inicial_message como um parâmetro no construtor e a definimos para a variável de estadomessage.

Na segunda linha do construtor, inicializamos a variávelcreator com um valor chamadomsg.sender. O motivo pelo qual não há necessidade de injetarmsg no construtor é porquemsg é uma variável global que fornece informações específicas sobre a mensagem, como o endereço da conta que a está enviando.

Poderíamos usar essas informações para implementar o controle de acesso para determinadas funções.

4.2. Métodos Setter e Getter

Finalmente, implementamos os métodos setter e getter para omessage:

function greet() constant returns (string) {
    return message;
}

function setGreeting(string _message) {
    message = _message;
}

Invocar a funçãogreet simplesmente retornará omessage. salvo atualmente. Usamos a palavra-chaveconstant para especificar que esta função não modifica o estado do contrato e não aciona nenhuma gravação no blockchain .

Agora podemos alterar o valor do estado no contrato chamando a funçãosetGreeting. Qualquer pessoa pode alterar o valor apenas chamando esta função. Este método não tem um tipo de retorno, mas leva um tipoString como parâmetro.

Agora que criamos nosso primeiro contrato inteligente, a próxima etapa será implantá-lo no blockchain Ethereum para que todos possam usá-lo. Podemos usarRemix, que é atualmente o melhor IDE online e é fácil de usar.

5. Interagindo com um contrato inteligente

Para interagir com um contrato inteligente na rede descentralizada (blockchain), precisamos ter acesso a um dos clientes.

Existem duas maneiras de fazer isso:

Infura é a opção mais direta, portanto, solicitaremos umfree access token. Assim que nos inscrevermos, precisamos escolher o URL da rede de teste Rinkeby:“https://rinkeby.infura.io/<token>”.

Para fazer a transação com o contrato inteligente de Java, precisamos usar uma biblioteca chamadaWeb3j. Aqui está a dependência do Maven:


    org.web3j
    core
    3.3.1

E em Gradle:

compile ('org.web3j:core:3.3.1')

Antes de começar a escrever código, há algumas coisas que precisamos fazer primeiro.

5.1. Criação de uma carteira

O Web3j nos permite usar algumas de suas funcionalidades na linha de comando:

  • Criação de carteira

  • Gerenciamento de senhas da carteira

  • Transferência de fundos de uma carteira para outra

  • Gerar wrappers de função de contrato inteligente do Solidity

As ferramentas de linha de comando podem ser obtidas como um arquivo zip / tarball na páginareleases do repositório do projeto, na seção de downloads, ou para usuários do OS X via homebrew:

brew tap web3j/web3j
brew install web3j

Para gerar uma nova carteira Ethereum, basta digitar o seguinte na linha de comando:

$ web3j wallet create

Ele solicitará uma senha e um local onde podemos salvar nossa carteira. O arquivo está no formato Json, e o principal a ser lembrado é o endereço Ethereum.

Vamos usá-lo na próxima etapa para solicitar um Ether.

5.2. Solicitando éter na rede de teste Rinkeby

Podemos solicitar Etherhere grátis. Para impedir que agentes mal-intencionados esgotem todos os fundos disponíveis, eles nos pedem para fornecer um link público a uma postagem de mídia social com nosso endereço Ethereum.

Este é um passo muito simples, quase instantaneamente eles fornecem o Éter para que possamos executar os testes.

5.3. Gerando o Smart Contract Wrapper

O Web3j pode gerar automaticamente o código do wrapper de contrato inteligente para implantar e interagir com contratos inteligentes sem sair da JVM.

Para gerar o código do wrapper, precisamos compilar nosso contrato inteligente. Podemos encontrar a instrução para instalar o compiladorhere. A partir daí, digite o seguinte na linha de comando:

$ solc Greeting.sol --bin --abi --optimize -o /

O último criará dois arquivos:Greeting.bineGreeting.abi. Agora, podemos gerar o código do wrapper usando as ferramentas de linha de comando do web3j:

$ web3j solidity generate /path/to/Greeting.bin
  /path/to/Greeting.abi -o /path/to/src/main/java -p com.your.organisation.name

Com isso, agora teremos a classe Java para interagir com o contrato em nosso código principal.

6. Interagindo com o contrato inteligente

Em nossa classe principal, começamos criando uma nova instância web3j para conectar-se a nós remotos na rede:

Web3j web3j = Web3j.build(
  new HttpService("https://rinkeby.infura.io/"));

Em seguida, precisamos carregar nosso arquivo de carteira Ethereum:

Credentials credentials = WalletUtils.loadCredentials(
  "",
 "/path/to/");

Agora vamos implantar nosso contrato inteligente:

Greeting contract = Greeting.deploy(
  web3j, credentials,
  ManagedTransaction.GAS_PRICE, Contract.GAS_LIMIT,
  "Hello blockchain world!").send();

A implantação do contrato pode demorar um pouco, dependendo do trabalho na rede. Depois de implantado, convém armazenar o endereço em que o contrato foi implantado. Podemos obter o endereço desta maneira:

String contractAddress = contract.getContractAddress();

Todas as transações feitas com o contrato podem ser vistas na url: “https://rinkeby.etherscan.io/address/<contract_address>”.

Por outro lado, podemos modificar o valor do contrato inteligente que executa uma transação:

TransactionReceipt transactionReceipt = contract.setGreeting("Hello again").send();

Finalmente, se quisermos ver o novo valor armazenado, podemos simplesmente escrever:

String newValue = contract.greet().send();

7. Conclusão

Neste tutorial, vimos queSolidity é uma linguagem de programação com tipo estático projetada para desenvolver contratos inteligentes que são executados no EVM.

Também criamos um contrato direto com essa linguagem e vimos que ela é muito semelhante a outras linguagens de programação.

Osmart contract é apenas uma frase usada para descrever um código de computador que pode facilitar a troca de valor. Ao executar no blockchain, um contrato inteligente se torna um programa de computador auto-operacional que é executado automaticamente quando condições específicas são atendidas.

Vimos neste artigo que a capacidade de executar código no blockchain é a principal diferenciação no Ethereum, porque permite que os desenvolvedores criem um novo tipo de aplicativo que vai muito além do que já vimos antes.

Como sempre, as amostras de código podem ser encontradasover on GitHub.