Interagindo com contratos externos
Contratos inteligentes podem interagir com outros contratos na blockchain Ethereum, permitindo que eles chamem funções, leiam variáveis e enviem Ether ou tokens. Uma maneira de facilitar essa interação é usando Web3j, uma biblioteca Java leve para trabalhar com Ethereum. O Web3j pode auto-gerar código de invólucro de contrato inteligente, permitindo a implantação e interação perfeitas com contratos inteligentes a partir do JVM.
Para interagir com contratos externos usando o Web3j, primeiro você precisará compilar seu contrato inteligente e gerar o código de wrapper. Em seguida, você pode criar e implantar seu contrato inteligente ou usar um contrato existente, facilitando a transação e chamando métodos de contrato inteligente diretamente.
Eventos e registros
Eventos são cruciais para rastrear e monitorar a atividade do contrato inteligente na blockchain. Eles fornecem uma maneira de emitir logs que podem ser armazenados e posteriormente recuperados por sistemas off-chain. Os eventos facilitam o rastreamento de eventos de contrato específicos ou alterações em variáveis de estado, o que é especialmente útil para dApps (aplicações descentralizadas) que requerem atualizações em tempo real.
Os logs são os registros emitidos pelos eventos e armazenados na blockchain. Eles são uma parte essencial do ecossistema Ethereum, pois permitem uma comunicação eficiente entre contratos inteligentes e sistemas off-chain. Os logs também são indexados, tornando fácil para as aplicações filtrar e pesquisar eventos ou pontos de dados específicos.
Exemplo: Implantação de um contrato inteligente usando Remix e MetaMask
Passo 1: Abrir o Remix IDE
Primeiro, abra o Remix IDE ( https://remix.ethereum.org/) no seu navegador da web.
Passo 2: Criar um novo arquivo
Clique no botão "+" no canto superior esquerdo do IDE para criar um novo Espaço de Trabalho em Branco. Em seguida, clique na página "Novo Arquivo" para criar um novo arquivo
Nomeie o arquivo “Auction.sol”.
Passo 3: Defina o contrato
Copie e cole o seguinte código no novo arquivo “Auction.sol”:
TypeScript// SPDX-License-Identifier: MIT// Especifique a solidez da versãopragma ^0.8.0;// Defina o contrato de leilãocontrato Leilão { // Declare as variáveis de estado endereço do proprietário público a pagar; // O proprietário do contrato (pode cancelar o leilão) uint public startBlock; // O número do bloco em que o leilão começa uint public endBlock; // O número do bloco no qual o leilão termina string public ipfsHash; // IPFS hash para o item que está sendo leiloado bool público cancelado; Se o leilão foi cancelado e o público terminou; Se o leilão terminou com o maior lance público; O maior lance até agora é o maior lance público; O endereço do maior lance // Declarar eventos evento LeilãoCancelado(); Evento emitido quando o leilão é cancelado evento HighestBidIncreased (endereço do licitante, valor do uint); Evento emitido quando um novo lance mais alto é definido evento AuctionEnded(endereço vencedor, valor uint); Evento emitido quando o leilão termina // Declarar mapeamento de saldos públicos (endereço => uint256); Construtor função construtor() { owner = payable(msg.sender); // Defina o proprietário para o endereço que implanta o contrato startBlock = block.number; // Defina o bloco inicial para o número de bloco atual endBlock = startBlock + 40320; // Defina o bloco final para 1 semana (40320 blocos) após o bloco inicial ipfsHash = ""; Inicialize o hash IPFS para uma cadeia de caracteres vazia } // Função para colocar uma função de lance placeBid() public payable { require(block.number >= startBlock && block.number <= endBlock, "Auction is not active."); // Verifique se o leilão está ativo require(msg.value > highestBid, "Já há um lance maior."); // Verifique se o novo lance é maior do que o lance mais alto atual exigido(!cancelado, "O leilão está cancelado."); // Verifique se o leilão não foi cancelado Se houve um lance mais alto anterior, adicione o valor do lance ao saldo se (highestBidder != address(0)) { balances[highestBidder] += highestBid; } // Defina o novo lance mais alto e o lance mais altoBid = msg.value; highestBidder = pagável (msg.sender); Emitir um evento para sinalizar que um novo lance mais alto foi definido emitir HighestBidIncreased (msg.sender, msg.value); } // Função para cancelar o leilão função cancelAuction() public { require(msg.sender == owner, "Somente o proprietário pode cancelar o leilão."); // Verifique se o remetente é o proprietário require(!ended, "Leilão já terminou."); // Verifique se o leilão ainda não terminou // Defina a bandeira cancelada e emita um evento para sinalizar que o leilão foi cancelado cancelado = true; emitir LeilãoCancelado(); } // Função para encerrar a função de leilão endAuction() public { require(block.number > endBlock, "Auction is not over yet."); // Verifique se o leilão acabou(!cancelado, "Leilão está cancelado."); // Verifique se o leilão não foi cancelado require(!ended, "Leilão já terminou."); // Verifique se o leilão ainda não terminou // Defina a bandeira encerrada e emita um evento para sinalizar que o leilão terminou = true; emitir AuctionEnded(highestBidder, highestBid); Transfira o maior valor de lance para o proprietário owner.transfer(highestBid); Se houve um lance mais alto anterior, adicione o valor do lance ao saldo se (highestBidder != address(0)) { balances[highestBidder] += highestBid; } } // Função para definir o hash IPFS para o item que está sendo leiloado função setIpfsHash(string memory hash) public { require(msg.sender == owner, "Somente o proprietário pode definir o hash IPFS."); // Verifique se o remetente é o proprietário ipfsHash = hash; // Defina o hash IPFS para o valor fornecido }}
Este código define o Leilão
contrato, que permite aos usuários fazer lances em um item e encerra o leilão após um período especificado. O contrato também possui uma função para cancelar o leilão e uma função para definir um hash IPFS para o item que está sendo leiloado.
Passo 4: Compilar o contrato
Clique na guia “Solidity Compiler” no menu da esquerda. Em “Compilar Auction.sol”, clique no botão “Compilar”. O contrato deve ser compilado com sucesso e você deve ver uma marca de seleção verde ao lado de “Auction.sol” no explorador de arquivos.
Etapa 5: Implementar o contrato
Clique na guia “Implantar & Executar Transações” no menu à esquerda. Em “Ambiente”, selecione “Web3 Injetado” como o ambiente. Em “Contrato”, selecione “Leilão” como o contrato a ser implantado. Clique no botão “Implantar”.
Passo 6: Interaja com o contrato
Uma vez que o contrato é implantado, você pode interagir com ele usando as várias funções definidas no contrato. Por exemplo, você pode chamar o placeBid()
função para fazer uma oferta no item
Ao usar o Remix e o MetaMask, você pode facilmente implantar e interagir com contratos inteligentes na rede Ethereum, possibilitando o desenvolvimento e teste de aplicativos descentralizados em um ambiente amigável ao usuário.
Destaques
Contratos inteligentes podem interagir com outros contratos na blockchain Ethereum, permitindo chamadas de função, leitura de variáveis e a transferência de Ether ou tokens.
Web3j é uma biblioteca Java leve que facilita a interação com o Ethereum. Ele pode auto-gerar código de invólucro de contrato inteligente para implantação e interação perfeitas com contratos a partir do JVM.
Eventos são essenciais para rastrear e monitorar a atividade do contrato na blockchain. Eles emitem registros que podem ser armazenados e recuperados por sistemas off-chain, permitindo atualizações em tempo real para dApps.
Registros, que são os registros emitidos por eventos, desempenham um papel crucial na comunicação eficiente entre contratos inteligentes e sistemas off-chain. Eles são indexados, permitindo a filtragem e busca fácil de eventos ou pontos de dados específicos.
O exemplo fornecido demonstra o processo de implantação de um contrato inteligente usando o Remix IDE e o MetaMask. Ele inclui etapas como criar um novo arquivo, definir o contrato, compilá-lo, implantá-lo e interagir com suas funções.
Interagindo com contratos externos
Contratos inteligentes podem interagir com outros contratos na blockchain Ethereum, permitindo que eles chamem funções, leiam variáveis e enviem Ether ou tokens. Uma maneira de facilitar essa interação é usando Web3j, uma biblioteca Java leve para trabalhar com Ethereum. O Web3j pode auto-gerar código de invólucro de contrato inteligente, permitindo a implantação e interação perfeitas com contratos inteligentes a partir do JVM.
Para interagir com contratos externos usando o Web3j, primeiro você precisará compilar seu contrato inteligente e gerar o código de wrapper. Em seguida, você pode criar e implantar seu contrato inteligente ou usar um contrato existente, facilitando a transação e chamando métodos de contrato inteligente diretamente.
Eventos e registros
Eventos são cruciais para rastrear e monitorar a atividade do contrato inteligente na blockchain. Eles fornecem uma maneira de emitir logs que podem ser armazenados e posteriormente recuperados por sistemas off-chain. Os eventos facilitam o rastreamento de eventos de contrato específicos ou alterações em variáveis de estado, o que é especialmente útil para dApps (aplicações descentralizadas) que requerem atualizações em tempo real.
Os logs são os registros emitidos pelos eventos e armazenados na blockchain. Eles são uma parte essencial do ecossistema Ethereum, pois permitem uma comunicação eficiente entre contratos inteligentes e sistemas off-chain. Os logs também são indexados, tornando fácil para as aplicações filtrar e pesquisar eventos ou pontos de dados específicos.
Exemplo: Implantação de um contrato inteligente usando Remix e MetaMask
Passo 1: Abrir o Remix IDE
Primeiro, abra o Remix IDE ( https://remix.ethereum.org/) no seu navegador da web.
Passo 2: Criar um novo arquivo
Clique no botão "+" no canto superior esquerdo do IDE para criar um novo Espaço de Trabalho em Branco. Em seguida, clique na página "Novo Arquivo" para criar um novo arquivo
Nomeie o arquivo “Auction.sol”.
Passo 3: Defina o contrato
Copie e cole o seguinte código no novo arquivo “Auction.sol”:
TypeScript// SPDX-License-Identifier: MIT// Especifique a solidez da versãopragma ^0.8.0;// Defina o contrato de leilãocontrato Leilão { // Declare as variáveis de estado endereço do proprietário público a pagar; // O proprietário do contrato (pode cancelar o leilão) uint public startBlock; // O número do bloco em que o leilão começa uint public endBlock; // O número do bloco no qual o leilão termina string public ipfsHash; // IPFS hash para o item que está sendo leiloado bool público cancelado; Se o leilão foi cancelado e o público terminou; Se o leilão terminou com o maior lance público; O maior lance até agora é o maior lance público; O endereço do maior lance // Declarar eventos evento LeilãoCancelado(); Evento emitido quando o leilão é cancelado evento HighestBidIncreased (endereço do licitante, valor do uint); Evento emitido quando um novo lance mais alto é definido evento AuctionEnded(endereço vencedor, valor uint); Evento emitido quando o leilão termina // Declarar mapeamento de saldos públicos (endereço => uint256); Construtor função construtor() { owner = payable(msg.sender); // Defina o proprietário para o endereço que implanta o contrato startBlock = block.number; // Defina o bloco inicial para o número de bloco atual endBlock = startBlock + 40320; // Defina o bloco final para 1 semana (40320 blocos) após o bloco inicial ipfsHash = ""; Inicialize o hash IPFS para uma cadeia de caracteres vazia } // Função para colocar uma função de lance placeBid() public payable { require(block.number >= startBlock && block.number <= endBlock, "Auction is not active."); // Verifique se o leilão está ativo require(msg.value > highestBid, "Já há um lance maior."); // Verifique se o novo lance é maior do que o lance mais alto atual exigido(!cancelado, "O leilão está cancelado."); // Verifique se o leilão não foi cancelado Se houve um lance mais alto anterior, adicione o valor do lance ao saldo se (highestBidder != address(0)) { balances[highestBidder] += highestBid; } // Defina o novo lance mais alto e o lance mais altoBid = msg.value; highestBidder = pagável (msg.sender); Emitir um evento para sinalizar que um novo lance mais alto foi definido emitir HighestBidIncreased (msg.sender, msg.value); } // Função para cancelar o leilão função cancelAuction() public { require(msg.sender == owner, "Somente o proprietário pode cancelar o leilão."); // Verifique se o remetente é o proprietário require(!ended, "Leilão já terminou."); // Verifique se o leilão ainda não terminou // Defina a bandeira cancelada e emita um evento para sinalizar que o leilão foi cancelado cancelado = true; emitir LeilãoCancelado(); } // Função para encerrar a função de leilão endAuction() public { require(block.number > endBlock, "Auction is not over yet."); // Verifique se o leilão acabou(!cancelado, "Leilão está cancelado."); // Verifique se o leilão não foi cancelado require(!ended, "Leilão já terminou."); // Verifique se o leilão ainda não terminou // Defina a bandeira encerrada e emita um evento para sinalizar que o leilão terminou = true; emitir AuctionEnded(highestBidder, highestBid); Transfira o maior valor de lance para o proprietário owner.transfer(highestBid); Se houve um lance mais alto anterior, adicione o valor do lance ao saldo se (highestBidder != address(0)) { balances[highestBidder] += highestBid; } } // Função para definir o hash IPFS para o item que está sendo leiloado função setIpfsHash(string memory hash) public { require(msg.sender == owner, "Somente o proprietário pode definir o hash IPFS."); // Verifique se o remetente é o proprietário ipfsHash = hash; // Defina o hash IPFS para o valor fornecido }}
Este código define o Leilão
contrato, que permite aos usuários fazer lances em um item e encerra o leilão após um período especificado. O contrato também possui uma função para cancelar o leilão e uma função para definir um hash IPFS para o item que está sendo leiloado.
Passo 4: Compilar o contrato
Clique na guia “Solidity Compiler” no menu da esquerda. Em “Compilar Auction.sol”, clique no botão “Compilar”. O contrato deve ser compilado com sucesso e você deve ver uma marca de seleção verde ao lado de “Auction.sol” no explorador de arquivos.
Etapa 5: Implementar o contrato
Clique na guia “Implantar & Executar Transações” no menu à esquerda. Em “Ambiente”, selecione “Web3 Injetado” como o ambiente. Em “Contrato”, selecione “Leilão” como o contrato a ser implantado. Clique no botão “Implantar”.
Passo 6: Interaja com o contrato
Uma vez que o contrato é implantado, você pode interagir com ele usando as várias funções definidas no contrato. Por exemplo, você pode chamar o placeBid()
função para fazer uma oferta no item
Ao usar o Remix e o MetaMask, você pode facilmente implantar e interagir com contratos inteligentes na rede Ethereum, possibilitando o desenvolvimento e teste de aplicativos descentralizados em um ambiente amigável ao usuário.
Destaques
Contratos inteligentes podem interagir com outros contratos na blockchain Ethereum, permitindo chamadas de função, leitura de variáveis e a transferência de Ether ou tokens.
Web3j é uma biblioteca Java leve que facilita a interação com o Ethereum. Ele pode auto-gerar código de invólucro de contrato inteligente para implantação e interação perfeitas com contratos a partir do JVM.
Eventos são essenciais para rastrear e monitorar a atividade do contrato na blockchain. Eles emitem registros que podem ser armazenados e recuperados por sistemas off-chain, permitindo atualizações em tempo real para dApps.
Registros, que são os registros emitidos por eventos, desempenham um papel crucial na comunicação eficiente entre contratos inteligentes e sistemas off-chain. Eles são indexados, permitindo a filtragem e busca fácil de eventos ou pontos de dados específicos.
O exemplo fornecido demonstra o processo de implantação de um contrato inteligente usando o Remix IDE e o MetaMask. Ele inclui etapas como criar um novo arquivo, definir o contrato, compilá-lo, implantá-lo e interagir com suas funções.