# 以太坊 gas fuel and fees

By [高同学Daniel](https://paragraph.com/@danielgao) · 2021-12-05

---

EVM
---

以太坊虚拟机（EVM）：世界计算机。包括了计算操作和数据存储。

transaction
-----------

EVM中一个单独的会话，是交互的最基本单位。通常称之为交易。

gas
---

gas是使用“世界计算机”资源的计量单位。

打个比方，电是用千瓦时计量的。在以太坊中使用更多的计算和存储意味着使用更多的gas。

计量的一个根本原因是它为矿工提供了运转（operate）世界计算机的动机。这些矿工从处理交易中获得一笔由计量制度--gas--决定的费用。

EVM中的每个操作都要消耗gas。例如，一个乘法(MUL)消耗5个gas，一个加法(ADD)消耗3个gas。

对于任何交易，都将收取21000 gas的基本费用。这些费用可用于支付运行椭圆曲线算法所需的费用。

该算法旨在从签名中恢复发送者的地址以及存储交易所花费的硬盘和带宽空间。

[以太坊的操作指令和其对应的gas消耗](https://docs.google.com/spreadsheets/d/1m89CVujrQe5LAFJ8-YAUCcNK950dUzMQPMJBxRtGCqs/edit#gid=0)

fuel
----

燃料。

等同于gas。

gwei
----

1gwei = 0.000000001Ether

**gas price**:每单位gas价值几个gwei。

此价格由市场决定。

startGas
--------

*   startGas is the term(术语) in the [Ethereum White Paper](https://github.com/ethereum/wiki/wiki/White-Paper)
    
*   gasLimit is the term in the [Ethereum Yellow Paper](https://github.com/ethereum/yellowpaper),
    
*   software, such as [Geth](https://github.com/ethereum/go-ethereum/releases) and [web3.js](https://github.com/ethereum/web3.js/releases), simply uses the term “gas”.
    

一个transaction执行前的预付gas量。 

remainingGas
------------

 transaction成功执行后剩余的gas量。

fees
----

fees = (startGas — remainingGas) × gas price.

fees以ether为计量单位。

!Unsupported embed

Out of Gas exception
--------------------

如果一个transaction执行到中途，设定的startGas耗尽的话，该transaction里已经被执行的操作将被撤销，已经消耗的gas将不会被退回。

账户对账户的ETH转账的startGas的默认值是21000，并且是够用的；但是与合约交互时21000的startGas有可能是不够用的。有的exchange设置的startGas都是21000，有可能会提前耗尽，所以在使用的时候要注意。

Block gas limit (BGL)
---------------------

The BGL is currently 4,712,388 (digits of 1.5π)。现在是多少呢？

每个块中可以包含多少笔transaction呢？

答案是：BGL/（所有transaction的startGas之和）。

高StartGas的延迟问题
--------------

既然有Out of Gas exception的风险以及gas退还的机制。那么，是不是startGas设置的越高越好呢？

不是。

原因在于transaction的startGas和它实际消耗的gas之间的差异。矿工只能从交易中实际消耗的gas中获得报酬；所有未使用的gas将退还给发起人。

假设有一笔交易的startGas是4,000,000，另外有100比交易的startGas都是40,000。矿工可能会优先处理收益更具可预测性的这100比小交易。

所以超高startGas是有害的，会带来延迟执行。

Gas refund
----------

以太坊退款机制。

参考链接：[GasToken：我为何不再担心 gas 价格飙升](https://ethfans.org/ajian1984/articles/37998)

[GasToken](https://gastoken.io/) 巧妙地利用了 gas 定价系统。它利用的是清理状态、清理存储插槽（storage slot）和删除带有自毁操作码的合约（这些操作都可以删减全局状态树）所收到的 gas 退款。这些操作都可以被认为具备负 gas 价格。

*   清理/自毁合约：- 24,000 gas
    
*   清理/删除存储：-15,000 gas
    

当 EVM 执行这类操作时，gas 退款是通过一个**独立的交易退款计量器来计算的**。gas 退款只会在交易结束时提供。另外，最高 gas 退款量是该交易所消耗 gas 量的一半。

理想情况是在网络 gas 价格较低时写入状态，并在 gas 价格较高时删除状态。由于以 Wei/ETH 为计价单位的总费用是 gas 使用量和 gas 价格的乘积，当 gas 价格较高时，减少 gas 使用量会导致总费用降低。

GasToken 的正统实现很好地体现了名称中的 “token（代币）”部分，因为它与 ERC-20 代币相似，并带有 `approve` 和 `transferFrom`操作码，可以称为多步骤交易的一部分。最初，GasToken 有两种变体，分别采用不同的设计：GST1 和 GST2。GST1 使用的是存储成本和退款机制，GST2 使用的是 `CREATE` 和自毁机制。这些变体采取不同的节约方案，具体取决于 gas 价格差值比（铸造代币和释放代币时的 gas 价格差值比）。由于 gas 价格率更高，GST2 更能节约 gas。

开采或 “铸造” GasToken 就是将其 写入存储/创建合约，而销毁或 “释放” GasToken 就是减少用户持有的 GasToken 数量并删除状态存储插槽。虽然正统的 GasToken 很流行，但是许多开发者选择克隆这一功能，并放到他们自己的系统合约中使用，从而减少成本和设计复杂性。

---

*Originally published on [高同学Daniel](https://paragraph.com/@danielgao/gas-fuel-and-fees)*
