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.) 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: 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. É assim que esses contratos podem parecer: Confira esta amostra de transação no buraco que maxia o número de 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. 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: 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.Gás computacional total
Contrato de exemplo
// 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)
}
}
}
}
SSTORE
operações.
Mudança proposta: reembolsos de transações separados da contabilidade de gás em bloco
Fontesethresear