O que são tokens de gás e exemplo de uso para a Uniswap v2
Os preços do gás estiveram ocasionalmente acima de 1.000 Gwei no passado, nas horas de pico. Dado um preço de ETH de mais de 1.000 USD, isso pode levar a custos reais e insanos de transação. Em particular, isso pode ser uma dor de cabeça, pois ao utilizar as DEXs da blockchain, como a Uniswap, o resultado são taxas de transação de centenas de dólares para uma única negociação.
As pessoas têm usado tokens de gás para combater esse problema. Vamos explorar o que são, como usá-los e como você os integraria nas negociações da Uniswap.
O que são Tokens de Gás?
Os tokens de gás são tokens ERC-20 da Ethereum que permitem aos usuários tokenizar gás na rede Ethereum, armazenando gás quando é barato e usando/distribuindo esse gás quando é caro.
O uso dos tokens de gás é particularmente útil para cenários de arbitragem de exchanges descentralizadas ou compra antecipada de ICOs. Eles também permitem que os usuários comprem e vendam gás diretamente, permitindo a criação de um “banco” de gás de longo prazo, o que pode ajudar a proteger os usuários do aumento dos preços do gás.
Os tokens de gás funcionam devido ao mecanismo de reembolso da rede Ethereum. Sempre que você liberar armazenamento, a Ethereum reembolsará um pouco de gás por isso, porque você está reduzindo o tamanho da blockchain. Zerar uma variável de armazenamento de 32 bytes libera 15.000 gás, enquanto a configuração para 0 custa 5.000, efetivamente fornecendo 3x de retorno de gás. Alternativamente, pode-se autodestruir um contrato. Isso custaria 700 para a chamada ao contrato + 5.000 para a operação de autodestruição, mas reembolsaria um valor maior: 24.000 de gás.
E é nisso que os tokens de gás estão sendo utilizados. Você pode cunhá-los e eles armazenarão dados no contrato. Então você pode queimar os tokens dentro de uma transação que liberará gás. Os reembolsos só podem fornecer até metade do gás usado na transação.
Atualmente, existem três versões disponíveis:
- GST1
- GST2
- Chi-Gas
O GST1 usa o mecanismo de variáveis de armazenamento que é mais eficiente quando os preços do gás entre a cunhagem e a queima são menos de 3,71x diferentes. Em nossos tempos atuais de flutuações insanas de gás, provavelmente é melhor você escolher outra alternativa. O GST2 depende do mecanismo de autodestruição do contrato, assim como o Chi-Gas.
O que são tokens Chi-Gas, ou tokens de gás Chi?
Os tokens de gás Chi adicionaram três maneiras de melhorar a eficiência do GST2:
- Redução do tamanho do endereço do contrato minerando uma chave privada com o gerador de endereços Profanity, o que permitiu diminuir o tamanho dos subcontratos em 1 byte;
- Uso da instrução
CREATE2
para implantar subcontratos inteligentes para sua descoberta de endereço eficiente durante o processo de queima; - Correção das incompatibilidades ERC20 do GST2.
Você pode usar o Chi-Gas em seus contratos usando o modificador abaixo.
modifier discountCHI {
uint256 gasStart = gasleft();
_;
uint256 initialGas = 21000 + 16 * msg.data.length;
uint256 gasSpent = initialGas + gasStart - gasleft();
uint256 freeUpValue = (gasSpent + 14154) / 41947;
chi.freeFromUpTo(msg.sender, freeUpValue);
}
Uma breve explicação dos valores constantes:
-
21000
= custo inicial de uma transação -
16 * msg.data.length
= custo de calldata (consulte a EIP-2028) -
gasStart - gasleft()
= o custo real de gás usado pelo seu código -
14154
= custosfreeFromUpTo
-
41947
= reembolso por token de gás queimado * 2 (vezes dois, devido ao reembolso máximo de metade de todos os custos de gás)
Agora tudo que você precisa fazer é adicionar a interface ChiToken com o endereço:
interface ChiToken {
function freeFromUpTo(address from, uint256 value) external;
}
ChiToken constant public chi = ChiToken(0x0000000000004946c0e9F43F4Dee607b0eF1fA1c);
E então seu modificador estará funcionando. Quando você quiser usá-lo, certifique-se de cunhar e aprovar os tokens Chi para o seu contrato antecipadamente. Ah, e você também pode implantar novos contratos com o Chi-Gas usando o deployer.eth.
Exemplo: Adicionando tokens Chi à integração UniSwap v2
Vamos construir em cima da minha integração Uniswap v2 anterior. Como lembrete, ela é construída sobre a rede de testes Kovan usando o DAI. Tudo o que precisamos fazer é adicionar o modificador discountCHI
e adicionar uma nova função com esse modificador.
function convertEthToDaiWithGasRefund(uint daiAmount) external payable discountCHI {
_convertEthToDai(daiAmount);
}
Parabéns, nosso Unicórnio já está soltando seu gás!
Exemplo totalmente funcional do Remix
Aqui está um exemplo totalmente funcional que você pode usar diretamente no Remix. Veja abaixo as instruções de como usá-lo e uma comparação.
// SPDX-License-Identifier: MIT
pragma solidity 0.8.1;
import "https://github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/interfaces/IUniswapV2Router02.sol";
interface ChiToken {
function freeFromUpTo(address from, uint256 value) external;
}
contract UniswapExample {
ChiToken constant public chi = ChiToken(0x0000000000004946c0e9F43F4Dee607b0eF1fA1c);
IUniswapV2Router02 constant public uniRouter = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
address constant public multiDaiKovan = 0x4F96Fe3b7A6Cf9725f59d353F723c1bDb64CA6Aa;
modifier discountCHI {
uint256 gasStart = gasleft();
_;
uint256 gasSpent = 21000 + gasStart - gasleft() + 16 * msg.data.length;
chi.freeFromUpTo(msg.sender, (gasSpent + 14154) / 41947);
}
function convertEthToDai(uint daiAmount) external payable {
_convertEthToDai(daiAmount);
}
function convertEthToDaiWithGasRefund(uint daiAmount) external payable discountCHI {
_convertEthToDai(daiAmount);
}
function getEstimatedETHforDAI(uint daiAmount) external view returns (uint256[] memory) {
return uniRouter.getAmountsIn(daiAmount, _getPathForETHtoDAI());
}
function _getPathForETHtoDAI() private pure returns (address[] memory) {
address[] memory path = new address[](2);
path[0] = uniRouter.WETH();
path[1] = multiDaiKovan;
return path;
}
function _convertEthToDai(uint daiAmount) private {
// usando 'agora' por conveniência no Remix, para prazo de passagem da rede principal do frontend!
uint deadline = block.timestamp + 15;
uniRouter.swapETHForExactTokens{ value: msg.value }(
daiAmount,
_getPathForETHtoDAI(),
address(this),
deadline
);
// reembolsar ETH restante ao usuário
(bool success,) = msg.sender.call{ value: address(this).balance }("");
require(success, "reembolso falhou");
}
// importante para receber ETH
receive() payable external {}
}
Passo a passo do exemplo da Uniswap
- Primeiro, temos que cunhar alguns tokens Chi-Gas. Mude a rede na MetaMask para Kovan e obtenha alguns ETH de teste. Agora você pode cunhar tokens Chi-Gas através do Etherscan. Clique em
mint
e cunhe pelo menos 4 tokens. - Agora temos que implantar o contrato acima na Kovan através do Remix. Faça isso e copie o endereço.
- Agora podemos aprovar novamente pelo menos 4 tokens para nosso contrato através do Etherscan e clicar em
approve
. - Agora podemos chamar a função
convertEthToDaiWithGasRefund
, mas não se esqueça de fornecer Wei suficiente no canto superior esquerdo do Remix. Como comparação, podemos chamarconvertEthToDai
para ver a diferença. Certifique-se de definir um preço de gás mais alto para refletir na rede principal.
Aqui está uma comparação da minha negociação sem e com o Chi-Gas:
Economizamos um pouco, presumindo que cunhamos o Chi-Gas durante os períodos de preços mais baixos do gás.
Tokens de gás não existirão no futuro
Vitalik Buterin publicou recentemente uma nova EIP-3298 que propõe remover o mecanismo de reembolso. Permito que ele explique:
“Os reembolsos de gás para SSTORE e SELFDESTRUCT foram originalmente introduzidos para motivar os desenvolvedores de aplicativos a escrever aplicativos que pratiquem “boa higiene de estado”, limpando slots de armazenamento e contratos que não são mais necessários. No entanto, eles não são amplamente utilizados para isso, e a falta de higiene continua a ser a norma. Agora é amplamente aceito que a única solução para o crescimento do estado é alguma forma de ausência de estado ou expiração do estado e, se tal solução for implementada, os slots de armazenamento e contratos não utilizados começarão a ser ignorados automaticamente.” Vitalik Buterin
Ele vai ainda mais longe, especificando sobre os tokens de gás que, em suas palavras, têm 'desvantagens para a rede, particularmente na exacerbação do tamanho do estado (já que os slots de estado são efetivamente usados como uma "bateria" para economizar gás), e na obstrução ineficiente do uso de gás na blockchain'.
Lembre-se de que esta é uma EIP muito nova e não entrará em vigor tão cedo. Mas podemos ver no horizonte que os tokens de gás não existirão para sempre.
Artigo original publicado por Markus Waas. Traduzido por Paulinho Giovannini.
Top comments (0)