第七章 去中心化自治组织(DAO)

2.3 交易手续费

首先我们要清楚即使是交易,比特币和以太坊都相差甚远:

  • 如果不拥堵,比特币交易(转账)的手续费可以很低,可以相当长的时间内没有什么变化,并且还可以每笔转账的手续费的差别都很小。因为比特币只要以转账所占用的账单字节数决定手续费的多少就行了。

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

以下是以太坊交易计费设计的相关原则:

  • 以太坊手续费被称为Gas。Gas就是矿工记账收取的ETH的数量。

  • Gas = Gwei(Gas Price) * Gas Limit

  • 以太坊每个区块所消耗的总Gas Limit是有限的。每个智能合约将消耗的Gas Limit必然小于以太坊的总Gas Limit,否则你将无法操作(部署和调用)这个智能合约。

  • 你可以预判你将要操作的一个或一组智能合约的Gas Limit和Gwei。事实上没有人会自己计算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,来限制每个区块所用的资源——或者说,来保证以太坊始终能够让其承载的智能合约都自如地得到应用。

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

阅读参考:

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