Ether, Wei e Taxa de Gas

porMatheusem06/05/2022

Nesse artigo iremos falar um pouco sobre as taxas de gas da blockchain e como economizar na hora de escrever seu contrato inteligente.

Ether e Wei

Na rede da Ethereum, as transações são pagas com Ether, assim como na rede da Binance Smart Chain, as transações são pagas com BNB, na rede da Polygon as transações são pagas com MATIC e assim por diante.

Assim como em nossa moeda convencional, um dólar é o mesmo que 100 centavos de dólar, na blockchain, um ether é igual a 10^18 wei.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract EtherUnits {
uint public umWei = 1 wei;
// 1 wei é igual a 1
bool public ehUmWei = 1 wei == 1;
uint public umEther = 1 ether;
// 1 ether é igual a 10^18 wei
bool public ehUmEther = 1 ether == 1e18;
}

Taxas de Gas

Quanto ether você precisa para pagar por uma transação?

Você paga o gas spent * gas price valor do ether, onde

  • gas é a unidade de cálculo
  • gas spent é o valor total de gas usado em uma transação
  • gas price é quanto ether você está disposto a pagar por gas

As transações com preço de gas mais altos acabam tendo maior prioridade para serem adicionadas em um bloco. O gas que não foi utilizado é reembolsado para sua carteira.

Limite de gas

Existem 2 limites superiores para a quantidade de gas que você pode gastar

  • gas limit quantidade máxima de gas que você deseja pagar por uma transação, é definida por você
  • block gas limit quantidade máxima de gas permitida em um bloco, definido pela rede
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract Gas {
uint public i = 0;
// Usar todo o gas que você envia faz com que sua transação falhe
// As alterações de estado são desfeitas
// O gas que foi utilizado não será reembolsado
function forever() public {
// Aqui um exemplo de um loop onde irá executar até que todo o gas seja gasto
// e consequentemente sua transação irá falhar
while (true) {
i += 1;
}
}
}

Você pode conferir como estão as taxas de gas de cada rede de blockchain abaixo

Limite de gas

Existem 2 limites superiores para a quantidade de gas que você pode gastar

  • gas limit quantidade máxima de gas que você deseja pagar por uma transação, é definida por você
  • block gas limit quantidade máxima de gas permitida em um bloco, definido pela rede

Técnicas de economia de Gas

Algumas técnicas de economia de gas.

  • Substituindo memory por calldata
  • Carregando variáveis de estado na memória
  • Substitua i++ por ++i em funções com loops
  • Armazenando elementos em uma matriz utilizando cache
  • Circuito curto das funções
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
// gas golf
contract GasGolf {
// taxa gas inicial - 50908 gas
// usando calldata - 49163 gas
// carregando variáveis na memória - 48952 gas
// Circuito curto - 48634 gas
// incrementador do loop - 48244 gas
// matriz em cache - 48209 gas
// carregar elementos da matriz na memória - 48047 gas
// desmarque estou transbordando/subfluindo - 47309 gas
uint public total;
// começo - sem otimização na taxa de gas
// function sumIfEvenAndLessThan99(uint[] memory nums) external {
// for (uint i = 0; i < nums.length; i += 1) {
// bool isEven = nums[i] % 2 == 0;
// bool isLessThan99 = nums[i] < 99;
// if (isEven && isLessThan99) {
// total += nums[i];
// }
// }
// }
// otimização de taxa de gas
// [1, 2, 3, 4, 5, 100]
function sumIfEvenAndLessThan99(uint[] calldata nums) external {
uint _total = total;
uint len = nums.length;
for (uint i = 0; i < len; ) {
uint num = nums[i];
if (num % 2 == 0 && num < 99) {
_total += num;
}
unchecked {
++i;
}
}
total = _total;
}
}

Testar no Remix