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: MITpragma solidity ^0.8.13;contract EtherUnits {uint public umWei = 1 wei;// 1 wei é igual a 1bool public ehUmWei = 1 wei == 1;uint public umEther = 1 ether;// 1 ether é igual a 10^18 weibool 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álculogas spent
é o valor total de gas usado em uma transaçãogas 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: MITpragma 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á reembolsadofunction forever() public {// Aqui um exemplo de um loop onde irá executar até que todo o gas seja gasto// e consequentemente sua transação irá falharwhile (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
porcalldata
- 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: MITpragma solidity ^0.8.13;// gas golfcontract 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 gasuint 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;}}