Interagindo com contratos externos
Os contratos inteligentes podem interagir com outros contratos no blockchain Ethereum, permitindo que 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 gerar automaticamente código wrapper de contrato inteligente, permitindo a implantação e interação perfeitas com contratos inteligentes da JVM.
Para interagir com contratos externos usando Web3j, primeiro precisará compilar seu contrato inteligente e gerar o código de envoltório. Em seguida, pode criar e implementar seu contrato inteligente ou usar um contrato existente, tornando fácil transacionar e chamar métodos de contrato inteligente diretamente.
Eventos e registos
Os eventos são cruciais para rastrear e monitorizar a atividade de contratos inteligentes na blockchain. Eles fornecem uma maneira de emitir registos 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 necessitam de atualizações em tempo real.
Os logs são os registos emitidos pelos eventos e são armazenados na blockchain. Eles são uma parte essencial do ecossistema Ethereum, pois possibilitam uma comunicação eficiente entre contratos inteligentes e sistemas off-chain. Os logs também são indexados, facilitando a filtragem e pesquisa de eventos ou pontos de dados específicos para as aplicações.
Exemplo: Implementar um contrato inteligente usando o Remix e o 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 ficheiro
Clique no botão “+” no canto superior esquerdo da IDE para criar um novo Espaço de Trabalho em branco. Em seguida, clique na Página “Novo Ficheiro” para criar um novo Ficheiro
Nomeie o ficheiro “Auction.sol”.
Passo 3: Definir o contrato
Copie e cole o seguinte código no novo ficheiro “Auction.sol”:
TypeScript// SPDX-License-Identifier: MIT// Especifique a versão Soliditypragma solidity ^0.8.0;// Defina o contrato de leilãocontrato Leilão { // Declare variáveis de estado endereço a pagar proprietário público; // 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 a ser leiloado bool public cancelado; Se o leilão foi cancelado bool público terminou; Se o leilão terminou com o maior lance público; O lance mais alto até agora endereça-se ao maior lance público pagável; O endereço do licitante mais alto // Declarar eventos evento AuctionCanceled(); Evento emitido quando o leilão é cancelado evento HighestBidIncreased (endereço licitante, valor 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 mapeamento (endereço => uint256) saldos públicos; Constructor function constructor() { 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 de início ipfsHash = ""; Inicialize o hash IPFS para uma string vazia } // Função para colocar uma função de licitação placeBid() public payable { require(block.number >= startBlock && block.number <= endBlock, "Auction is not ative."); // Verifique se o leilão está ativo require(msg.value > highestBid, "Já existe uma licitação mais elevada."); // Verifique se a nova licitação é superior à exigida pela licitação mais alta atual (!cancelada, "Leilão cancelado."); // Verificar 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[highestLicder] += highestBid; } // Defina o novo lance mais alto e o lance mais altoBid = msg.value; highestBidder = a pagar (msg.sender); Emitir um evento para sinalizar um novo lance mais alto foi definido emitir HighestBidIncreased (msg.sender, msg.value); } // Função para cancelar a função de leilão cancelAuction() public { require(msg.sender == owner, "Only the owner can cancel the auction."); // Verifique se o remetente é o proprietário require(!ended, "Auction has already ended."); // 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 terminar a função de leilão endAuction() public { require(block.number > endBlock, "O leilão ainda não acabou."); // Verifique se o leilão acabou(!cancelado, "Leilão cancelado."); // Verificar se o leilão não foi cancelado exigir(!terminou, "O leilão já terminou."); // Verifique se o leilão ainda não terminou // Defina a bandeira terminada e emita um evento para sinalizar que o leilão terminou = true; emitir AuctionEnded(highestBidder, highestBid); Transferir o valor de lance mais alto 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[highestLicder] += 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 utilizadores fazerem licitações num item e termina 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 em leilão.
Passo 4: Compilar o contrato
Clique na aba "Compilador Solidity" no menu do lado esquerdo. Em "Compilar Auction.sol", clique no botão "Compilar". O contrato deve ser compilado com sucesso e você deve ver uma marca de verificação verde ao lado de "Auction.sol" no explorador de arquivos.
Passo 5: Implementar o contrato
Clique no separador “Implementar e Executar Transações” no menu do lado esquerdo. Em “Ambiente”, selecione “Web3 Injetado” como ambiente. Em “Contrato”, selecione “Leilão” como contrato a implementar. Clique no botão “Implementar”.
Passo 6: Interaja com o contrato
Uma vez que o contrato é implementado, pode interagir com ele usando as várias funções definidas no contrato. Por exemplo, pode chamar o placeBid()
função para colocar uma oferta no item
Ao usar o Remix e o MetaMask, pode facilmente implementar e interagir com contratos inteligentes na rede Ethereum, permitindo o desenvolvimento e teste de aplicações descentralizadas num ambiente amigável para o utilizador.
Destacados
Os 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. Pode auto-gerar código de invólucro de contrato inteligente para implantação e interação perfeitas com contratos a partir do JVM.
Os eventos são essenciais para rastrear e monitorar a atividade do contrato no blockchain. Eles emitem logs que podem ser armazenados e recuperados por sistemas off-chain, permitindo atualizações em tempo real para dApps.
Os registos, que são os registos emitidos pelos eventos, desempenham um papel crucial na comunicação eficiente entre contratos inteligentes e sistemas fora da cadeia. Estão indexados, permitindo a filtragem e pesquisa fácil de eventos específicos ou pontos de dados.
O exemplo fornecido demonstra o processo de implementação de um contrato inteligente usando o Remix IDE e o MetaMask. Inclui passos como criar um novo ficheiro, definir o contrato, compilá-lo, implementá-lo e interagir com as suas funções.
Interagindo com contratos externos
Os contratos inteligentes podem interagir com outros contratos no blockchain Ethereum, permitindo que 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 gerar automaticamente código wrapper de contrato inteligente, permitindo a implantação e interação perfeitas com contratos inteligentes da JVM.
Para interagir com contratos externos usando Web3j, primeiro precisará compilar seu contrato inteligente e gerar o código de envoltório. Em seguida, pode criar e implementar seu contrato inteligente ou usar um contrato existente, tornando fácil transacionar e chamar métodos de contrato inteligente diretamente.
Eventos e registos
Os eventos são cruciais para rastrear e monitorizar a atividade de contratos inteligentes na blockchain. Eles fornecem uma maneira de emitir registos 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 necessitam de atualizações em tempo real.
Os logs são os registos emitidos pelos eventos e são armazenados na blockchain. Eles são uma parte essencial do ecossistema Ethereum, pois possibilitam uma comunicação eficiente entre contratos inteligentes e sistemas off-chain. Os logs também são indexados, facilitando a filtragem e pesquisa de eventos ou pontos de dados específicos para as aplicações.
Exemplo: Implementar um contrato inteligente usando o Remix e o 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 ficheiro
Clique no botão “+” no canto superior esquerdo da IDE para criar um novo Espaço de Trabalho em branco. Em seguida, clique na Página “Novo Ficheiro” para criar um novo Ficheiro
Nomeie o ficheiro “Auction.sol”.
Passo 3: Definir o contrato
Copie e cole o seguinte código no novo ficheiro “Auction.sol”:
TypeScript// SPDX-License-Identifier: MIT// Especifique a versão Soliditypragma solidity ^0.8.0;// Defina o contrato de leilãocontrato Leilão { // Declare variáveis de estado endereço a pagar proprietário público; // 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 a ser leiloado bool public cancelado; Se o leilão foi cancelado bool público terminou; Se o leilão terminou com o maior lance público; O lance mais alto até agora endereça-se ao maior lance público pagável; O endereço do licitante mais alto // Declarar eventos evento AuctionCanceled(); Evento emitido quando o leilão é cancelado evento HighestBidIncreased (endereço licitante, valor 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 mapeamento (endereço => uint256) saldos públicos; Constructor function constructor() { 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 de início ipfsHash = ""; Inicialize o hash IPFS para uma string vazia } // Função para colocar uma função de licitação placeBid() public payable { require(block.number >= startBlock && block.number <= endBlock, "Auction is not ative."); // Verifique se o leilão está ativo require(msg.value > highestBid, "Já existe uma licitação mais elevada."); // Verifique se a nova licitação é superior à exigida pela licitação mais alta atual (!cancelada, "Leilão cancelado."); // Verificar 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[highestLicder] += highestBid; } // Defina o novo lance mais alto e o lance mais altoBid = msg.value; highestBidder = a pagar (msg.sender); Emitir um evento para sinalizar um novo lance mais alto foi definido emitir HighestBidIncreased (msg.sender, msg.value); } // Função para cancelar a função de leilão cancelAuction() public { require(msg.sender == owner, "Only the owner can cancel the auction."); // Verifique se o remetente é o proprietário require(!ended, "Auction has already ended."); // 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 terminar a função de leilão endAuction() public { require(block.number > endBlock, "O leilão ainda não acabou."); // Verifique se o leilão acabou(!cancelado, "Leilão cancelado."); // Verificar se o leilão não foi cancelado exigir(!terminou, "O leilão já terminou."); // Verifique se o leilão ainda não terminou // Defina a bandeira terminada e emita um evento para sinalizar que o leilão terminou = true; emitir AuctionEnded(highestBidder, highestBid); Transferir o valor de lance mais alto 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[highestLicder] += 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 utilizadores fazerem licitações num item e termina 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 em leilão.
Passo 4: Compilar o contrato
Clique na aba "Compilador Solidity" no menu do lado esquerdo. Em "Compilar Auction.sol", clique no botão "Compilar". O contrato deve ser compilado com sucesso e você deve ver uma marca de verificação verde ao lado de "Auction.sol" no explorador de arquivos.
Passo 5: Implementar o contrato
Clique no separador “Implementar e Executar Transações” no menu do lado esquerdo. Em “Ambiente”, selecione “Web3 Injetado” como ambiente. Em “Contrato”, selecione “Leilão” como contrato a implementar. Clique no botão “Implementar”.
Passo 6: Interaja com o contrato
Uma vez que o contrato é implementado, pode interagir com ele usando as várias funções definidas no contrato. Por exemplo, pode chamar o placeBid()
função para colocar uma oferta no item
Ao usar o Remix e o MetaMask, pode facilmente implementar e interagir com contratos inteligentes na rede Ethereum, permitindo o desenvolvimento e teste de aplicações descentralizadas num ambiente amigável para o utilizador.
Destacados
Os 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. Pode auto-gerar código de invólucro de contrato inteligente para implantação e interação perfeitas com contratos a partir do JVM.
Os eventos são essenciais para rastrear e monitorar a atividade do contrato no blockchain. Eles emitem logs que podem ser armazenados e recuperados por sistemas off-chain, permitindo atualizações em tempo real para dApps.
Os registos, que são os registos emitidos pelos eventos, desempenham um papel crucial na comunicação eficiente entre contratos inteligentes e sistemas fora da cadeia. Estão indexados, permitindo a filtragem e pesquisa fácil de eventos específicos ou pontos de dados.
O exemplo fornecido demonstra o processo de implementação de um contrato inteligente usando o Remix IDE e o MetaMask. Inclui passos como criar um novo ficheiro, definir o contrato, compilá-lo, implementá-lo e interagir com as suas funções.