# 2.3 交易与Gas

## 交易

交易（Transaction）是由帐户发出，带密码学签名的指令。 帐户发起交易即可更新以太坊网络的状态（State，就是我们常说的数据）。

最简单的交易是将 ETH 从一个账户转到另一个帐户。

例如，如果 Bob 发送 Alice 1 ETH，则 Bob 的帐户必须减少 1 ETH，而 Alice 的账户必须增加 1 ETH。 此项操作发生在交易中，会变更状态。

和比特币一样，以太坊交易需要收费并且必须开采才能有效。我们常将交易手续费称为 Gas，将记账流程称为挖矿。

所提交的交易包括下列信息：

* `recipient` – 接收地址（如果为一个外部持有的帐户，交易将传输值。 如果为合约帐户，交易将执行合约代码）
* `signature` – 发送者的标识符。 当通过发送者的私钥签名交易来确保发送者已授权此交易时，生成此签名。
* `value` – 从发件人向收件人转移 ETH 的金额 （以 WEI 为单位，ETH 的一种面值单位）
* `data` – 可包括任意数据的可选字段
* `gasLimit` – 交易可以消耗的 Gas 的最大数量。 Gas 单位代表了计算步骤
* `maxPriorityFeePerGas` - 作为矿工小费包含的最大 gas 数量
* `maxFeePerGas` - 愿意为交易支付的最大 gas 数量（包括 `baseFeePerGas` 和 `maxPriorityFeePerGas`）

更多内容请见：

<https://ethereum.org/zh/developers/docs/transactions/>

## Gas

Gas 本指在以太坊网络上执行特定操作（包括简单的代币转账）所需的计算工作量。由于用户必须为此计算支付费用，所以 Gas 又常指成功进行交易发起请求的用户所需支付的费用，即交易手续费。

Gas = `gasLimit` \* `gasPrice`

`gasLimit` 和 `gasPrice` 决定了支付给矿工的最高交易费用。 [关于 Gas 的更多信息](https://ethereum.org/zh/developers/docs/gas/)。

以下是以太坊交易计费设计的基本原则：

* 以太坊手续费被称为Gas。Gas就是矿工记账收取的ETH的数量。这也就是说，Gas 费用是以太坊的ETH 支付的。
* Gas 价格以 Gwei 标明，Gwei 本身就是 ETH 的一个单位：1 ETH = 10^9 Gwei（9个0）= 10^18 Wei（18个0）。 例如，您可以说您的 Gas 成本为 1 Gwei，而不是说您的 Gas 成本为 0.000000001 ETH。 “gwei”一词本身表示“giga-wei”，等于 1,000,000,000 wei。 Wei 本身（以 [b-money](https://www.investopedia.com/terms/b/bmoney.asp) 的发明者 [Wei Dai](https://wikipedia.org/wiki/Wei_Dai) 命名）是 ETH 中最小的单位。
* Gas = Gas Price(一般标示为Gwei的数量) \* Gas Limit
* 以太坊每个区块所消耗的总Gas Limit是有限的（但会随着以太坊性能的提升而阶段性增长）。请注意每个智能合约将消耗的Gas Limit通常小于以太坊的总Gas Limit，反之你将无法操作（部署和调用）这个智能合约。
* 你可以预判你将要操作的一个或一组智能合约的Gas Limit和Gas Price。事实上没有人会自己计算Gas Limit的大小（软件会帮你预判，此时它叫start gas，并且很容易理解通常预判的start gas大于实际所需），加上矿工通常会优先为慷慨的手续费支付者服务，如果你担心操作不能顺利完成，那么通常就应该调高Gas Price也就是Gwei的数值，而支付更高的手续费给矿工。
* 如果一项操作成功全部执行。实际消耗的Gas Limit往往比最初设定的要少, 假设gas\_rem 是其所剩。在交易结束的时候系统会返还gas\_rem\*gas\_price 数量的ETH到交易发起者的账户。矿工实际收取的交易手续费则为(start\_gas-gas\_rem)\*gas\_price 数量的ETH。
* 如果一项操作在执行过程中发现耗尽你支付的Gas还不够，那么所有执行的操作都会回滚，但消耗的资源仍然真实有效，已经发生的交易费用将被转账给矿工。 这就是我们通常所说的操作被取消（或者支付失败），但手续费还是被扣了。
* 当一个智能合约向另一个智能合约发送消息时，它也可以选择设置Gas Limit，这些Gas用于支付由该消息引起的调用。如果在调用执行完成前Gas不够，则该调用状态会被回滚，但Gas仍然被消耗掉了，即你将损失掉手续费。
* 和智能合约交互时将消耗的 Gas Limit 又叫做执行成本(Execution Cost)，它是根据你的智能合约代码被自动计算出来的。

![一笔真实的交易](https://2013584272-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnqMq2joKlCl1znOQMV%2Fuploads%2Fgit-blob-0b220f01d6909f0b5e52ce54b4b587a840996d6f%2F2021-10-26_a-transaction.png?alt=media)

这不是一笔转账交易，而是用户与某个合约交互而产生的手续费。其 Gas Price 为0.000000121728588401 Ether ，或者说121.728588401 Gwei。

请注意：以太坊交易手续费，采用了竞价模式。矿工会优先处理出价高的交易请求！

还有，EIP-1559提案改变了手续费的算法，但因为它是一个过渡阶段的改变，在此就不做详细介绍了。

## 比特币和以太坊交易的差别

我们要清楚即使是交易，比特币和以太坊都相差甚远：

* 如果不拥堵，比特币交易（转账）的手续费可以很低，可以相当长的时间内没有什么变化，并且还可以每笔转账的手续费的差别都很小。因为比特币只要以转账所占用的账单字节数决定手续费的多少就行了。
* 以太坊的情况则要复杂很多，以太坊有外部账户（Externally Owned Accounts，EOA）和合约账户（Contracts Accounts，CA）两种账户。这意味着有些转账和比特币一样，是外部账户点对点的转账。这种类型的交易手续费同样可以很低而且相当长的时间内没有什么变化。而更多的以太坊手续费，是与其中大量的合约部署和调用有关的——将这种情况称之为“操作手续费”而不是交易手续费，其实更贴切些，但为了和上一种情况统一，我们仍然称之为交易手续费。很自然的，此时以太坊的交易计费就需要考虑与智能合约的部署和运行相关的很多资源的消耗，包含带宽消耗、存储消耗、计算消耗。这些资源都需要以太坊节点提供，和比特币相比，它就不能只考虑记录的数据量的多少。智能合约操作手续费往往大大高于外部账户点对点的转账。

比特币和以太坊的交易手续费的计算不光相差甚远，而且由此可知：比特币以每个账单的大小限制每个区块。以太坊以一个代表带宽消耗、存储消耗和计算消耗的总和的Gas Limit，来限制每个区块所用的资源——或者说，来保证以太坊始终能够让其承载的智能合约都自如地得到应用。

比特币和以太坊，显然不在同一个维度上。

阅读参考：

<https://zhuanlan.zhihu.com/p/33812720>
