WEB3DEV

Cover image for Contrato Inteligente Pausável em Solidity
Diogo Jorge
Diogo Jorge

Posted on

Contrato Inteligente Pausável em Solidity

Em contratos inteligentes Pausáveis, podemos pausar funções dentro dos contratos inteligentes. O proprietário de um contrato inteligente tem o direito de pausar ou iniciar uma determinada função dentro do contrato inteligente. Qual pode ser o caso de uso de um contrato inteligente pausável?

Suponha que estamos criando um contrato inteligente de cunhagem de NFT e queremos pausar a cunhagem por um determinado período de tempo. Para pausar a cunhagem de NFTs, podemos usar a funcionalidade que pausará a função.

Outro caso de uso do contrato inteligente pausável pode ser nas ofertas iniciais de moedas (ICOs). Quando criamos um novo token para usuários e queremos restringir os usuários a não negociar esses tokens antes de vendermos todos os tokens, para que possamos adicionar a funcionalidade pausável para que, como proprietário de um contrato, você tenha controle sobre a negociação de tokens.

Image description

O contrato inteligente pausável pode ser útil se o seu contrato tiver algum bug e um hacker tentar explorá-lo. Como proprietário de um contrato inteligente, você pode pausar o contrato para que possamos interromper o uso indevido do contrato inteligente.

Então, vamos ver como podemos escrever um contrato inteligente pausável. Após a explicação do código, explicarei as desvantagens do contrato inteligente pausável.

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.17;

contract PausableDemo {

   address public owner;
   bool public isPaused;

   constructor() {
       owner = msg.sender;
   }

   modifier onlyOwner() {
     require(msg.sender == owner, "On owner have access");
     _;
   }

   function setPaused(bool _paused) public onlyOwner {
       isPaused = _paused;
   }

   function withdraw(address payable _recipient) public onlyOwner {
       require(isPaused == false, "Contract Paused");
       payable(_recipient).transfer(address(this).balance);
   }
}
Enter fullscreen mode Exit fullscreen mode

Como exemplo, peguei um contrato inteligente que transferirá o valor do contrato inteligente para o usuário que chamará essa função. Apenas para mostrar a funcionalidade do contrato inteligente pausável, tenho que escolher esse código como exemplo.

Então vamos ver o código linha por linha

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.17;

contract PausableDemo {
Enter fullscreen mode Exit fullscreen mode

Nas primeiras 2 linhas, adicionamos a versão da licença e do solidity com as quais vamos compilar. Depois disso, nomeamos nosso contrato inteligente como PausableDemo

address public owner;
bool public isPaused;

constructor() {
  owner = msg.sender;
}
Enter fullscreen mode Exit fullscreen mode

inicializamos duas variáveis ​​de estado: owner e ispaused e depois disso, inicializamos o endereço do proprietário dentro da função construtora. Já msg. sender é uma variável global que contém o endereço da carteira do usuário que irá implantar o contato inteligente.

modifier onlyOwner() {
     require(msg.sender == owner, "On owner have access");
     _;
   }
Enter fullscreen mode Exit fullscreen mode

Depois disso, adicionamos um modificador que verifica a condição de propriedade de quem chama a função e o chamador deve ser o proprietário do contrato inteligente.

function setPaused(bool _paused) public onlyOwner {
       isPaused = _paused;
   }
Enter fullscreen mode Exit fullscreen mode

A função setPaused é para atualizar a variável de estado isPaused. A isPaused é uma variável booleana então podemos defini-la como verdadeira ou falsa. Somente o proprietário do contrato inteligente está autorizado a chamar essa função, pois usou o modificador onlyOwner que criamos acima.

function withdraw(address _recipient) public onlyOwner {
       require(isPaused == false, "Contract Paused");
       payable(_recipient).transfer(address(this).balance);
}
Enter fullscreen mode Exit fullscreen mode

Depois disso, temos uma função de retirada que verificará o status isPaused e, em seguida, irá transferir o valor do contrato inteligente para o usuário que chamou essa função.

require(isPaused == false, "Contract Paused");
Enter fullscreen mode Exit fullscreen mode

Essa linha garante que, como proprietário do contrato inteligente, eu tenha controle de pausa sobre essa função específica. Posso pausar e iniciar essa função sempre que quiser, então é assim que podemos adicionar funcionalidade pausável dentro do contrato inteligente.

Então é assim que podemos criar funcionalidade pausável. Como mencionei anteriormente, também existem algumas desvantagens da funcionalidade pausável, então vamos ver as desvantagens.

Desvantagens do contrato inteligente pausável

Como sabemos que o código do contrato inteligente é público e qualquer pessoa pode lê-lo, então a funcionalidade de pausa pode afetar a confiança dos usuários, porque depois de ver o código do contrato inteligente, os usuários saberão que você pode pausar a funcionalidade dentro do seu contrato inteligente. Suponha que você tenha um contrato inteligente de ICO e tenha adicionado essa funcionalidade a ele para que os usuários não estejam interessados ​​em comprar o token porque você pode pausar a retirada da funcionalidade a qualquer momento.

Em geral, se os usuários souberem que seu contrato inteligente pode ser pausado, eles não estarão interessados ​​em usar seu dApp. Para resolver esse problema, também podemos implementar uma pausa baseada em tempo, que garantirá que a pausa seja removida após um determinado período de tempo e que o proprietário não tenha controle sobre a pausa do contrato.

Conclusão

Neste artigo, aprendemos como escrever um contrato inteligente pausável e também sobre as vantagens e desvantagens do contrato inteligente pausável.

Este artigo foi escrito por Ismail e traduzido por Diogo Jorge. O artigo original pode ser lido aqui.

Top comments (0)