Tl; dr: Os reembolsos com escuridão de armazenamento são valiosos, mas podem inflar os números de gás de bloqueio – mantenha -os para os usuários, mas não os conte com o gás de bloco usado. O EIP-7778 restaura a contabilidade precisa do gás na cadeia para armazenamento.

O mecanismo de gás da Ethereum visa refletir com precisão o consumo de recursos computacionais. Para incentivar os usuários a manter o estado limpo e gerenciável, o Ethereum concede reembolsos de gás quando os slots de armazenamento são redefinidos para zero. Embora eficazes na redução do inchaço do estado, esses reembolsos atualmente complicam a contabilidade de gás, fazendo parecer que os blocos consomem menos recursos do que realmente o fazem.

Como funcionam os reembolsos de gás hoje

Transações que claras slots de armazenamento via SSTORE Operações, redefinindo um slot para zero, se qualifique para reembolsos de gás (ver EIP-3529). Por exemplo, uma transação que consome 45 milhões de gás com um reembolso de 20% custa efetivamente ao usuário:

tx.gas_used = 45,000,000 - (0.20 × 45,000,000) = 36,000,000 gas

Da mesma forma, outra transação que consome 9 milhões de gás com um reembolso de 20% resulta em:

tx.gas_used = 9,000,000 - (0.20 × 9,000,000) = 7,200,000 gas

Importante, o reembolso do gás de um A transação pode ser consumida por outro transação.

O que é problemático sobre o mecanismo atual?

Enquanto os reembolsos de gás incentivam efetivamente a limpeza de armazenamento, sua implementação atual reduz o uso total de gás contado contra o limite de gás do bloco. Como resultado, o uso de gás do bloco subestima o esforço computacional real realizado. Fundamentalmente, incentivos de longo prazo contra inchaço estatal não devem distorcer mecanismos de controlador de feedback de curto prazo, como o Basefee do EIP-1559.

Para entender claramente o impacto dos reembolsos de gás na contabilidade de gás em bloco, vamos formalizar isso mais sistematicamente.

Modelo formal de contrabando de gás

Definições

  • Bloquear o limite de gás: G_0
  • Taxa de reembolso: r = 0,2 (20%)
  • Gás mínimo necessário por transação: G _ {\ text {min}} = 21.000

Reembolso de gás na etapa eu

O reembolso do gás em cada etapa iterativa eu (começando de i = 1) é dado por:

R_i = g_0 \ times r^i

Por exemplo:

  • Etapa 1: R_1 = g_0 \ times r
  • Etapa 2: R_2 = g_0 \ times r^2etc.

Condição de parada

Continuamos gerando transações que desencadeiam mais reembolsos até o reembolso na etapa n cai abaixo do gás mínimo necessário:

R_n

Isolamento n:

G_0 \ times r^n

Resolvendo para n:

n> \ frac {\ log \ esquerda (\ frac {g _ {\ text {min}}} {g_0} \ right)} {\ log (r)}

Assim, o número da etapa de parada é:

n = \ esquerda \ lfloor \ frac {\ log \ left (\ frac {g _ {\ text {min}}} {g_0} \ right)} {\ log (r)} \ direita \ rfloor + 1

(\ lfloor x \ rfloor indica a função do piso, dando o maior número inteiro ≤ x.)

Gás computacional total

Resumindo todo o gás computacional usado até pisar N-1:

G _ {\ text {total}} = g_0 + g_0 r + g_0 r^2 + \ Dots + g_0 r^{n-1}

Conseguir fora G_0:

G _ {\ text {total}} = g_0 (1 + r + r^2 + \ Dots + r^{n-1})

Usando a fórmula da série geométrica:

1 + r + r^2 + \ Dots + r^{n -1} = \ frac {1 – r^{n}} {1 – r}

Nós conseguimos:

G _ {\ text {total}} = g_0 \ times \ frac {1 – r^{n}} {1 – r}

Substituindo nossos valores:

  • G_0 = 45.000.000
  • r = 0,2
  • G _ {\ text {min}} = 21.000

Calcular n:

n = \ esquerda \ lfloor \ frac {\ log \ esquerda (\ frac {21.000} {45.000.000} \ right)} {\ log (0.2)} \ direito \ rfloor + 1 = \ lfloor 4.766 \ rfloor + 1 = 5 = 5

Calcule o gás total:

G _ {\ text {total}} = 45.000.000 \ times \ frac {1 – (0.2)^5} {1 – 0,2} = 56.232.000

Isso demonstra um aumento de ~ 25% em relação ao limite inicial do gás, destacando como os reembolsos de corrente distorcem significativamente a contabilidade de gás em bloco.

Contrato de exemplo

É assim que esses contratos podem parecer:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Refundooor {
    mapping(uint256 => uint256) private storageSlots;

    /// @notice Pre‑fill `maxSlots` keys starting at `startKey`
    function chargeStorage(uint256 startKey, uint256 maxSlots) external {
        for (uint256 i = 0; i < maxSlots; i++) {
            storageSlots(startKey + i) = startKey + i + 1;
        }
    }

    /// @notice Clears exactly MAX_LOOPS slots unconditionally (no checks)
    fallback() external {
        assembly {
            let base := storageSlots.slot
            mstore(0x20, base)

            // MAX_LOOPS * ~5,109 gas/iter ≈ 45 000 000 gas
            let MAX_LOOPS := 8805

            for { let i := 0 } lt(i, MAX_LOOPS) { i := add(i, 1) } {
                // compute storage slot for key = i
                mstore(0x0, i)
                let s := keccak256(0x0, 0x40)
                // unconditionally write zero
                sstore(s, 0)
            }
        }
    }
}
  • Nós primeiro cobrar o contrato escrevendo para esvaziar slots de armazenamento.
  • Segundo, chamamos o fallback do contrato, definindo 8805 slots de armazenamento para zero.

Confira esta amostra de transação no buraco que maxia o número de SSTORE operações.

Eventualmente, o gás “contrabandeado” escala linearmente com o limite de gás de bloco. Com 100m de gás, um bloco pode vir com 125m de gás de trabalho real.


Mudança proposta: reembolsos de transações separados da contabilidade de gás em bloco

O EIP-7778 propõe a retenção de reembolsos no nível do usuário para incentivar o gerenciamento de armazenamento eficiente, mas removendo esses reembolsos da contabilidade de gás no nível do bloco. Isso garante que o uso de gás do bloco reflita com precisão o consumo real de recursos.

Os benefícios de implementar o EIP são:

  • Previsibilidade aprimorada: O trabalho real para blocos permanece abaixo do limite pretendido.
  • Aumento da estabilidade da rede: O DOS reduzido os riscos de cenários de piores casos relacionados ao armazenamento.
  • Incentivos de usuário preservados: Os usuários mantêm sua motivação para a limpeza do estado.

O EIP-7778 separa de forma limpa incentivos de usuário de restrições de recursos em todo o bloco, alinhando o uso de gás em bloco mais de perto com o trabalho real realizado.

Fontesethresear

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *