Skip to content

Contrato Inteligente Pausável em Solidity

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);
   }
}

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 {

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;
}

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");
     _;
   }

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;
   }

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);
}

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");

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.